Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dotnet core publish: include/exclude dir in output

Given aspnet project with folders:

/
  /sql
  /WebApp
    /Client
    /wwwroot
    /Views

On project.json I used

"publishOptions": {
    "include": [
      "..\\sql",
      "wwwroot",
      "Views",
      "web.config"
    ]
  }

And after dotnet publish there was sql, wwwroot and Views folders.

After migration to csproj (Microsoft.NET.Sdk.Web), I got

<None Update="..\sql\**\*;wwwroot\**\*;Views\**\*">
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</None>

After msbuild15 /t:publish (cli not works for me) there is wwwroot, Views AND Client with only json files inside. Files from sql copied but flattened.

I also try to change it to:

<Content Include="..\sql\**" CopyToPublishDirectory="PreserveNewest" />
<Content Remove="Client\*" CopyToPublishDirectory="Never" />

and got same output.

How to remove Client and preserve folder structure for sql?

like image 694
smg Avatar asked Apr 23 '17 10:04

smg


1 Answers

Update:

When using VS 2017 >= 15.3 or a .NET CLI version >= 2.0, there is a new feature that automatically adds Link metadata for a few known item types (including Content). This can be used like:

<Content Include="..\sql\**" LinkBase="sql" />

Original:

You can use this:

  <ItemGroup>
    <Content Remove="Client\**" />
    <Content Include="..\sql\**" CopyToPublishDirectory="PreserveNewest" Link="sql\%(RecursiveDir)\%(Filename)%(Extension)" />
  </ItemGroup>

The content include item's link metadata is a bit of hack to make MSBuild use the item's relative path as target path. This is because items outside of the "project cone" aren't considered in AssignTargetPath if they have no Link metadata (source).

Alternative to <Content Remove="..." /> you can also do this to still have the files inside VS:

<Content Update="Client\**" CopyToPublishDirectory="Never" />
like image 100
Martin Ullrich Avatar answered Oct 21 '22 17:10

Martin Ullrich