Как указать корневую папку для цели пакета?

Я публикую свое веб-приложение с помощью msbuild, вызывая следующую команду:

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

Содержимое zip файла всегда имеет глубокую структуру папок, содержащую полный путь от корня диска до папки проекта. Есть ли способ сделать его более плоским? Я хотел бы иметь папку проекта, такую ​​как root в zip.

Ответ 1

Вы можете использовать _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