.Net Core MS Build Package Creation Lifecycle

435 Views Asked by At

MSBuild quite powerful and important tool, but sometimes configuration of it is the same hard as making a spaceship or flying to Mars. Answers on next questions can help makes it a little bit more usefull and developer friendly: - How the MSBuild create a Package(zip)? - Does it use some temporary folders or direct from builds output ? - Why can the output folder content differ from a package content - What events can be used to add some custom logic?

The answers to this question could help me with the next long story short: I'm working with a .Net Core solution, that has the dependency on some other solutions DLLs files( that are not referenced directly, but required to be in the solution folder). On post-build event CL there is the option added as an entry point "\TaskEP" that is a starting point of the next pipeline :

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

Tasks are mostly done for add extra DLLs to package and in general looks like :

<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>

Basically, for me, this instruction to MSBuild to add "Extra.dll" to output package.
Pubxml is quite usual :

 <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> ....

And one instruction that replaces the long long path in the package to Short and defined one:

<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>

I also duplicated the same "Copy" tasks here in .pubxml file , play with different events "AfterBuild", "BeforePublish" but seems that all of the just ignoring. I can see the "Extra" DLLs files in the build output directory and all Info Messages on publishing, but not in the final "Super.WebApplication.zip" file !

1

There are 1 best solutions below

0
Vitalii On

The solution I found to copy extra files in .Net Core is taken from this documentation

<ItemGroup>
    <DotnetPublishFiles Include="$(MSBuildProjectDirectory)\..\..somepath..\Extra.dll;....dll" >
      <DestinationRelativePath>bin\x86\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </DotnetPublishFiles>
  </ItemGroup>