Жизненный цикл создания пакета сборки.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>