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 для образцов.