问题 如何为Package目标指定根文件夹?


我通过调用以下命令使用msbuild发布我的Web应用程序:

msbuild myweb.csproj /T:Package /P:PackageLocation=obj\Output\myweb.zip

zip文件的内容始终是深层文件夹结构,包含从驱动器根目录到项目文件夹的完整路径。有什么方法可以让它更平坦吗?我想在zip中有一个像root这样的项目文件夹。


6976
2018-06-11 15:40


起源



答案:


您可以使用 _PackageTempDir 代替 PackageLocation 对于类似IIS的扁平结构,但是如果你想保持带有清单的.zip和.cmd,那么你不能真正摆脱绝对路径而不重写Microsoft.Web.Publishing.targets或自定义任务由于使用var的方式。

<_PackageTempDir>$(PackageTempRootDir)\PackageTmp</_PackageTempDir>
<_PackageTempDirFullPath>$([System.IO.Path]::GetFullPath($(_PackageTempDir))</_PackageTempDirFullPath>
<_MSDeployDirPath Include="$(_PackageTempDir)" />
<_MSDeployDirPath_FullPath>@(_MSDeployDirPath->'%(FullPath)')</_MSDeployDirPath_FullPath>

然而,您可以通过使用本地共享隐藏绝对路径来欺骗msbuild并将其展平一点,如下所示:

net share foo=D:\Temp
msbuild WebApplication1.csproj /t:Package /p:PackageTempRootDir=\\localhost\foo

这将改变你当地的深刻道路 obj\Debug\Package\WebApplication1.zip\Content\_S_Slocalhost_Sfoo\PackageTmp


10
2018-06-12 00:49



为什么将PackageTempRootDir设置为_PackageTempDir? - Scott Stafford
@ScottStafford没有理由,只是另一种选择。我从此开始使用 PipelinePreDeployCopyAllFilesToOneFolder 直接防止不必要的双重包装和偶尔的符号链接。 - Ilya Kozhevnikov
很想看到那个解决方案......顺便说一句,这个对我们很有用。 - Scott Stafford
好像你只是说/ P:PackageTempRootDir = - 空值,它从路径中删除更多,并且似乎在其他地方没有任何影响。 - Arve Systad
@ArveSystad:非常感谢你。漫长的道路问题让我疯狂。 - Valamas


答案:


您可以使用 _PackageTempDir 代替 PackageLocation 对于类似IIS的扁平结构,但是如果你想保持带有清单的.zip和.cmd,那么你不能真正摆脱绝对路径而不重写Microsoft.Web.Publishing.targets或自定义任务由于使用var的方式。

<_PackageTempDir>$(PackageTempRootDir)\PackageTmp</_PackageTempDir>
<_PackageTempDirFullPath>$([System.IO.Path]::GetFullPath($(_PackageTempDir))</_PackageTempDirFullPath>
<_MSDeployDirPath Include="$(_PackageTempDir)" />
<_MSDeployDirPath_FullPath>@(_MSDeployDirPath->'%(FullPath)')</_MSDeployDirPath_FullPath>

然而,您可以通过使用本地共享隐藏绝对路径来欺骗msbuild并将其展平一点,如下所示:

net share foo=D:\Temp
msbuild WebApplication1.csproj /t:Package /p:PackageTempRootDir=\\localhost\foo

这将改变你当地的深刻道路 obj\Debug\Package\WebApplication1.zip\Content\_S_Slocalhost_Sfoo\PackageTmp


10
2018-06-12 00:49



为什么将PackageTempRootDir设置为_PackageTempDir? - Scott Stafford
@ScottStafford没有理由,只是另一种选择。我从此开始使用 PipelinePreDeployCopyAllFilesToOneFolder 直接防止不必要的双重包装和偶尔的符号链接。 - Ilya Kozhevnikov
很想看到那个解决方案......顺便说一句,这个对我们很有用。 - Scott Stafford
好像你只是说/ P:PackageTempRootDir = - 空值,它从路径中删除更多,并且似乎在其他地方没有任何影响。 - Arve Systad
@ArveSystad:非常感谢你。漫长的道路问题让我疯狂。 - Valamas