Как получить / установить имя пакета, созданного MSDeploy (Publish Target)? - PullRequest
0 голосов
/ 19 января 2019

Сценарий

При выполнении публикации (веб-сайт, а не веб-проект) с использованием приведенного ниже 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="(?&lt;!currentdir)(%25)(?!currentdir)" Input="$(MSBuildProperties)" Replacement="%25$1">
        <Output TaskParameter="Output" PropertyName="MSBuildProperties"/>
    </RegexReplace>
    <!-- Escape special characters for batch file (^, &, <, >, |) -->
    <RegexReplace Expression="([\^&amp;&lt;&gt;\|])" 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 чтобы получить это значение изменяется или передается куда-то. Но я бы хотел сделать это максимально надежным способом. То есть, если существует существующее свойство, на которое я могу ссылаться, чтобы получить / установить это имя, я хочу использовать его.

...