VS2010 Web Deploy: как убрать абсолютные пути и автоматизировать setAcl?
Интегрированное веб-развертывание в Visual Studio 2010 довольно приятно. Он может создать пакет, готовый для развертывания с использованием MSDeploy на целевой машине IIS. Проблема в том, что этот пакет будет перераспределен на клиент, который установит его сам, используя "Импорт приложения" из IIS, когда установлен MSDeploy.
Созданный пакет по умолчанию всегда включает полный путь от компьютера разработчика, "D:\Dev\XXX\obj\Debug\Package\PackageTmp" в файле исходного манифеста. Конечно, это не мешает установке, так как он был спроектирован таким образом, но в диалоге импорта выглядит безобразно и не имеет значения для клиента. Хуже того, он будет удивляться, что это за пути, и это выглядит довольно странно.
Настроив файл.csproj (добавив свойства MSBuild, используемые в задаче создания пакета), мне удалось добавить в пакет дополнительные параметры. Тем не менее, я провел большую часть дня в Web.Publishing.targets длиной 2600 строк, пытаясь понять, какой параметр влияет на поведение "пути разработки", напрасно. Я также пытался использовать setAcl для настройки безопасности в заданной папке после развертывания, но мне удалось сделать это только с MSBuild, используя относительный путь... это не должно иметь значения, если я решу первую проблему.
Я мог бы изменить сгенерированный архив после его создания, но я бы предпочел, чтобы все было автоматизировано с использованием MSBuild. Кто-нибудь знает как это сделать?
2 ответа
Отображаемый путь определяется свойством _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>
Я знаю, что это старый вопрос, и принятый ответ сделал работу для меня изначально, но есть лучший способ: 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 для образцов.