VS2010 Web Deploy:如何删除绝对路径并自动化setAcl?

时间:2010-06-02 17:18:28

标签: visual-studio-2010 msbuild msdeploy

Visual Studio 2010中的集成Web部署非常好用。它可以创建一个可以在目标IIS计算机上使用MSDeploy部署的程序包。问题是,这个软件包将被重新分发给一个客户端,当安装MSDeploy时,它将使用IIS中的“导入应用程序”自行安装它。

创建的默认包始终包含开发计算机的完整路径,源清单文件中的“D:\ Dev \ XXX \ obj \ Debug \ Package \ PackageTmp”。它不会阻止安装,因为它是以这种方式设计的,但它在导入对话框中看起来很丑,对客户端没有任何意义。更糟糕的是,他会想知道这些路径是什么,看起来很混乱。

通过自定义.csproj文件(通过添加包创建任务使用的MSBuild属性),我设法向包中添加其他参数。但是,我花了大部分时间在2600行的Web.Publishing.targets中试图了解哪些参数影响了“开发路径”行为,徒劳无功。我还尝试使用setAcl在部署后自定义给定文件夹的安全性,但我只是通过使用相对路径设法使用MSBuild执行此操作...但是如果我解决了第一个问题,则无关紧要。

我可以在创建后修改生成的存档,但我更喜欢使用MSBuild自动化所有存档。有谁知道怎么做?

2 个答案:

答案 0 :(得分:27)

显示的路径由属性_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>
    

答案 1 :(得分:3)

我知道这是一个古老的问题,并且接受的答案最初为我完成了工作,但还有更好的方法:http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

我在这里复制代码,以防链接死亡。所有的功劳都归功于Sayed - 作者。

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的要点。