VS2010 Web Deploy: как удалить абсолютные пути и автоматизировать setAcl?
Интегрированное развертывание Web в Visual Studio 2010 довольно приятно. Он может создать пакет, готовый к развертыванию с использованием MSDeploy на целевой машине IIS. Проблема в том, что этот пакет будет перераспределен клиенту, который сам установит его, используя "Импорт приложения" из IIS при установке MSDeploy.
Созданный по умолчанию пакет всегда включает полный путь от машины разработки "D:\Dev\XXX\obj\Debug\Package\PackageTmp" в исходном файле манифеста. Это не препятствует установке курса, поскольку он был разработан таким образом, но он выглядит уродливым в диалоговом окне импорта и не имеет никакого значения для клиента. Хуже того, он будет задаваться вопросом, каковы эти пути, и это выглядит довольно запутанным.
Отредактировав файл .csproj(добавив свойства MSBuild, используемые задачей создания пакета), мне удалось добавить дополнительные параметры в пакет. Тем не менее, я провел большую часть дня в 2600-строчных сетях Web.Publishing.targets, пытаясь понять, какой параметр повлиял на поведение "пути развития", тщетно. Я также попытался использовать setAcl для настройки безопасности в заданной папке после развертывания, но мне удалось сделать это только с помощью MSBuild с помощью относительного пути... неважно, разрешаю ли я первую проблему.
Я могу изменить созданный архив после его создания, но я бы предпочел, чтобы все было автоматизировано с помощью MSBuild. Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Отображаемый путь определяется свойством _MSDeployDirPath_FullPath
.
Это свойство задается этой цепочкой свойств:
-
<_MSDeployDirPath_FullPath>@(_MSDeployDirPath->'%(FullPath)')</_MSDeployDirPath_FullPath>
-
<_MSDeployDirPath Include="$(_PackageTempDir)" />
-
<_PackageTempDir>$(PackageTempRootDir)\PackageTmp</_PackageTempDir>
-
<PackageTempRootDir>$(IntermediateOutputPath)Package</PackageTempRootDir>
_MSDeployDirPath_FullPath <-- @(_MSDeployDirPath->'%(FullPath)') <-- _PackageTempDir <-- $(PackageTempRootDir)\PackageTmp
Как вы можете видеть, вы не можете иметь относительный путь, потому что _MSDeployDirPath_FullPath
является полным путем _MSDeployDirPath
.
Но вы можете упростить отображаемый путь, переопределив свойство _PackageTempDir
с помощью пути, который вы хотите отобразить для своего клиента. (Этот путь будет использоваться как временный каталог для генерации пакета)
Вы можете переопределить свойство:
-
В командной строке:
msbuild.exe projectfile.csproj /t:Package /p:_PackageTempDir=C:\Package
-
Или непосредственно в файле проекта:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- Must be after Microsoft.WebApplication.targets import -->
<PropertyGroup>
<_PackageTempDir>C:\Package</_PackageTempDir>
</PropertyGroup>
Ответ 2
Я знаю, что это старый вопрос, и принятый ответ выполнил эту работу для меня изначально, но есть лучший способ: http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx
Я копирую код здесь, в случае, если ссылка замирает. Все кредиты должны быть отправлены Сайеду - автору.
В вашем файле Package.pubxml
вы добавляете тег <Property Group>
:
<PackagePath Condition=" '$(PackagePath)'=='' ">website</PackagePath>
<EnableAddReplaceToUpdatePacakgePath Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='' ">true</EnableAddReplaceToUpdatePacakgePath>
<PackageDependsOn>
$(PackageDependsOn);
AddReplaceRuleForAppPath;
</PackageDependsOn>
И после <Property Group>
, но внутри <Project>
добавьте это:
<Target Name="AddReplaceRuleForAppPath" Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' ">
<PropertyGroup>
<_PkgPathFull>$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))</_PkgPathFull>
</PropertyGroup>
<!-- escape the text into a regex -->
<EscapeTextForRegularExpressions Text="$(_PkgPathFull)">
<Output TaskParameter="Result" PropertyName="_PkgPathRegex" />
</EscapeTextForRegularExpressions>
<!-- add the replace rule to update the path -->
<ItemGroup>
<MsDeployReplaceRules Include="replaceFullPath">
<Match>$(_PkgPathRegex)</Match>
<Replace>$(PackagePath)</Replace>
</MsDeployReplaceRules>
</ItemGroup>
</Target>
Вот пример с полным Package.pubxml для образцов.