Сценарий
При выполнении публикации (веб-сайт, а не веб-проект) с использованием приведенного ниже MSBuild XML и аргументом PackageAsSingleFile
является false
, сборка именует все файлы (и папку, в которой они находятся) с префиксом Archive
:
Archive\
Archive.deploy.cmd
Archive.deploy-readme.txt
Archive.SetParameters.xml
Archive.SourceManifest.xml
Когда аргумент PackageAsSingleFile
равен true
, сборка именует все файлы с префиксом website
:
website.zip
website.deploy.cmd
website.deploy-readme.txt
website.SetParameters.xml
website.SourceManifest.xml
Вопрос
Как мне получить / установить значение Archive
или website
, чтобы я мог ссылаться на один из файлов позже в скрипте без жесткого кодирования значения?
Сценарий
<Target Name="Publish" DependsOnTargets="CopyWebSiteReferences" Condition="'$(SkipPublish.ToLower())' != 'true'">
<PropertyGroup>
<MSBuildProperties>Configuration=$(Configuration)</MSBuildProperties>
<MSBuildProperties>$(MSBuildProperties);PublishProfile=$(PublishProfile)</MSBuildProperties>
<MSBuildProperties>$(MSBuildProperties);DeployOnBuild=true</MSBuildProperties>
<MSBuildProperties>$(MSBuildProperties);PackageAsSingleFile=false</MSBuildProperties>
<!-- More properties not shown -->
</PropertyGroup>
<!-- Escape % characters for batch file, unless they surround %currentdir% -->
<RegexReplace Expression="(?<!currentdir)(%25)(?!currentdir)" Input="$(MSBuildProperties)" Replacement="%25$1">
<Output TaskParameter="Output" PropertyName="MSBuildProperties"/>
</RegexReplace>
<!-- Escape special characters for batch file (^, &, <, >, |) -->
<RegexReplace Expression="([\^&<>\|])" Input="$(MSBuildProperties)" Replacement="^$1">
<Output TaskParameter="Output" PropertyName="MSBuildProperties"/>
</RegexReplace>
<!-- Escape ; character for MSBuild output -->
<RegexReplace Expression="%3B" Input="$(MSBuildProperties)" Replacement="%3B">
<Output TaskParameter="Output" PropertyName="MSBuildProperties"/>
</RegexReplace>
<Message Text="MSBuildProperties: $(MSBuildProperties)"/>
<MSBuild
Projects="$(WebSiteDir)\website.publishproj"
ContinueOnError="false"
Properties="$(MSBuildProperties)"/>
</Target>
Что я попробовал
После поиска в Google и ответа пустым я попытался включить подробное ведение журнала в родительском файле MSBuild, но, очевидно, это происходит внутри вызова website.publishproj
. Я потратил довольно много времени, пытаясь создать <Exec>
вызов MSBuild.exe
, чтобы передать аргумент /v:Diag
как , показанный здесь (заставить его работать без ошибок отнимает много времени) и кратко изучил MSBuild Loggers , но это долгий путь, чтобы получить ответ на этот простой вопрос!
Примечание
Я знаю, что могу просто сделать некоторую условную логику и выплюнуть слово Archive
или website
в зависимости от значения PackageAsSingleFile
, но это, конечно, сломается, если какое-либо имя свойства будет использоваться MSBuild чтобы получить это значение изменяется или передается куда-то. Но я бы хотел сделать это максимально надежным способом. То есть, если существует существующее свойство, на которое я могу ссылаться, чтобы получить / установить это имя, я хочу использовать его.