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 довольно обычная:И одна инструкция, которая заменяет длинный длинный путь в пакете на короткий и определенный:
<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", но, кажется, что все просто игнорируя.Я вижу «дополнительные» DLL-файлы в выходном каталоге сборки и все информационные сообщения при публикации, но не в конечном файле «Super.WebApplication.zip»!