16

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

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

通过自定义 .csproj 文件(通过添加包创建任务使用的 MSBuild 属性),我设法将其他参数添加到包中。然而,我下午的大部分时间都花在了 2600 行长的 Web.Publishing.targets 中,试图了解是什么参数影响了“开发路径”行为,但徒劳无功。我还尝试在部署后使用 setAcl 来自定义给定文件夹的安全性,但我只能通过使用相对路径来使用 MSBuild 做到这一点……但如果我解决了第一个问题并不重要。

我可以在创建后修改生成的存档,但我希望一切都使用 MSBuild 自动化。有谁知道这是怎么做到的吗?

4

2 回答 2

30

显示的路径由属性确定_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>
    
于 2010-06-15T20:19:21.260 回答
3

我知道这是一个老问题,并且接受的答案最初为我完成了这项工作,但有更好的方法: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示例的要点。

于 2013-12-23T16:13:50.817 回答