VS2010 Web Deploy: как удалить абсолютные пути и автоматизировать setAcl? - PullRequest
15 голосов
/ 02 июня 2010

Интегрированное веб-развертывание в Visual Studio 2010 довольно приятно.Он может создать пакет, готовый для развертывания с помощью MSDeploy на целевой машине IIS.Проблема в том, что этот пакет будет перераспределен на клиент, который сам установит его с помощью «Импортировать приложение» из IIS, когда установлен MSDeploy.

Созданный пакет по умолчанию всегда включает полный путь от компьютера разработчика ».D: \ Dev \ XXX \ obj \ Debug \ Package \ PackageTmp "в файле исходного манифеста.Конечно, это не мешает установке, так как он был спроектирован таким образом, но в диалоге импорта выглядит безобразно и не имеет никакого значения для клиента.Хуже того, ему будет интересно узнать, что это за пути, и это выглядит довольно странно.

Настроив файл .csproj (добавив свойства MSBuild, используемые в задаче создания пакета), мне удалось добавить в пакет дополнительные параметры.Тем не менее я провел большую часть дня в Web.Publishing.targets длиной 2600 строк, пытаясь понять, какой параметр влияет на поведение «пути разработки», напрасно.Я также пытался использовать setAcl для настройки безопасности в определенной папке после развертывания, но мне удалось сделать это только с помощью MSBuild, указав относительный путь ... хотя это не имеет значения, если я решу первую проблему.

Я мог бы изменить сгенерированный архив после его создания, но я бы предпочел, чтобы все было автоматизировано с использованием MSBuild.Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

27 голосов
/ 16 июня 2010

Отображаемый путь определяется свойством _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>
    
3 голосов
/ 23 декабря 2013

Я знаю, что это старый вопрос, и принятый ответ сделал работу для меня изначально, но есть лучший способ: 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 для образцов.

...