Жизненный цикл создания пакета сборки.Net Core MS

MSBuild довольно мощный и важный инструмент, но иногда его настройка так же сложна, как создание космического корабля или полет на Марс. Ответы на следующие вопросы могут помочь сделать его немного более полезным и удобным для разработчиков: - Как MSBuild создает пакет (zip)? - Использует ли он какие-то временные папки или напрямую из сборки? - Почему содержимое выходной папки может отличаться от содержимого пакета - Какие события можно использовать для добавления некоторой пользовательской логики?

Ответы на этот вопрос могут помочь мне в следующем длинном рассказе: я работаю с решением.Net Core, которое зависит от некоторых других DLL-файлов решений (на которые нет прямой ссылки, но они должны быть в решении). папка). В событии CL после постройки есть опция, добавленная в качестве точки входа "\TaskEP", которая является отправной точкой следующего конвейера:

<PropertyGroup>
<PipelineCopyAllFilesToOneFolderForMsdeployDependsOn>
  TaskEP;
  Task2;
  Task3;
  $(PipelineCopyAllFilesToOneFolderForMsdeployDependsOn);
</PipelineCopyAllFilesToOneFolderForMsdeployDependsOn>
<RunPostBuildEvent>Always</RunPostBuildEvent>

Задачи в основном выполняются для добавления дополнительных DLL в пакет и в целом выглядят так:

<Target Name="TaskEP" Condition="$(SomeConditions) == 'True'">
    <Message Importance="high" Text="TaskEP: Copying some files..." />
    <ItemGroup>
      <ItemsName Include="$(MSBuildProjectDirectory)\..\..somepath..\Extra.dll;....dll" />
      <FilesForPackagingFromProject Include="%(ItemsName.Identity)">
        <DestinationRelativePath>bin\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>

В принципе, для меня эта инструкция для MSBuild добавить "Extra.dll" в выходной пакет.
Pubxml довольно обычный:

 <PropertyGroup>
<WebPublishMethod>Package</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<_PackagePathShortened Condition="'$(_PackagePathShortened)' == ''">SuperWebSite</_PackagePathShortened>
<ExcludeApp_Data>False</ExcludeApp_Data>
<PackageLocation>..\..\..\..\BIN\WEB\Release\Publish\Super.WebApplication.zip</PackageLocation>
<PackageAsSingleFile>true</PackageAsSingleFile>
<TargetFramework>netcoreapp2.1</TargetFramework> ....

И одна инструкция, которая заменяет длинный длинный путь в пакете на короткий и определенный:

<Target Name="AddReplaceRuleForAppPath" BeforeTargets="BeforePublish">
<Message Text="Adding replace rules for application path '$(PublishIntermediateOutputPath)' replace with '$(_PackagePathShortened)'" Importance="high" />
<EscapeTextForRegularExpressions Text="$(PublishIntermediateOutputPath)">
  <Output PropertyName="_PackagePathRegex" TaskParameter="Result" />
</EscapeTextForRegularExpressions>
<!-- Add a replace rule for VSMSDeploy resp. MSdeploy to update the path -->
<ItemGroup>
  <MsDeployReplaceRules Include="replaceFullPath">
    <Match>$(_PackagePathRegex)</Match>
    <Replace>$(_PackagePathShortened)</Replace>
  </MsDeployReplaceRules>
</ItemGroup>

Я также продублировал те же задачи "Копировать" здесь, в файле.pubxml, поиграв с разными событиями "AfterBuild", "BeforePublish", но, похоже, все просто игнорировали. Я вижу файлы "Extra" DLL-файлов в выходном каталоге сборки и все информационные сообщения при публикации, но не в конечном файле "Super.WebApplication.zip"!

1 ответ

Решение, которое я нашел для копирования дополнительных файлов в.Net Core, взято из этой документации.

<ItemGroup>
    <DotnetPublishFiles Include="$(MSBuildProjectDirectory)\..\..somepath..\Extra.dll;....dll" >
      <DestinationRelativePath>bin\x86\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </DotnetPublishFiles>
  </ItemGroup>
Другие вопросы по тегам