且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

dotnet core 发布:在输出中包含/排除目录

更新时间:2023-02-09 08:50:17

更新:

当使用 VS 2017 >= 15.3 或 .NET CLI 版本 >= 2.0 时,有一项新功能会自动为一些已知项目类型(包括 Content代码>).这可以像这样使用:

原文:

你可以使用这个:

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

包含项目链接元数据的内容有点小技巧,可以让 MSBuild 使用项目的相对路径作为目标路径.这是因为如果项目锥"之外的项目没有 Link 元数据(来源.

替代 <Content Remove="..."/> 您也可以这样做以保留 VS 中的文件:

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?

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