Visual Studio 2010中的集成Web部署非常好用。它可以创建一个可以在目标IIS计算机上使用MSDeploy部署的程序包。问题是,这个软件包将被重新分发给一个客户端,当安装MSDeploy时,它将使用IIS中的“导入应用程序”自行安装它。
创建的默认包始终包含开发计算机的完整路径,源清单文件中的“D:\ Dev \ XXX \ obj \ Debug \ Package \ PackageTmp”。它不会阻止安装,因为它是以这种方式设计的,但它在导入对话框中看起来很丑,对客户端没有任何意义。更糟糕的是,他会想知道这些路径是什么,看起来很混乱。
通过自定义.csproj文件(通过添加包创建任务使用的MSBuild属性),我设法向包中添加其他参数。但是,我花了大部分时间在2600行的Web.Publishing.targets中试图了解哪些参数影响了“开发路径”行为,徒劳无功。我还尝试使用setAcl在部署后自定义给定文件夹的安全性,但我只是通过使用相对路径设法使用MSBuild执行此操作...但是如果我解决了第一个问题,则无关紧要。
我可以在创建后修改生成的存档,但我更喜欢使用MSBuild自动化所有存档。有谁知道怎么做?
答案 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的要点。