.NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题

Posted mq0036

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题相关的知识,希望对你有一定的参考价值。

作者: zyl910

一、缘由

项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持“Add As Link”方式引入文件。这时需要手工修改project.json文件了。
可能是因为最新版本已将 project.json 转为 .csproj,导致我花了一些功夫才找到配置办法,故写了这篇笔记。

二、引用其他目录下的源码等文件的办法

2.1 官网说明

官网的 project.json 和 csproj 属性之间的映射 里简单介绍了如何增加其他的引用文件。

文件在 project.json 中,可将生成和打包操作扩展为从不同的文件夹进行编译和嵌入。 在 MSBuild 中,使用项实现此操作。 以下示例是一个常见转换:

JSON:


  "buildOptions": 
    "compile": 
      "copyToOutput": "notes.txt",
      "include": "../Shared/*.cs",
      "exclude": "../Shared/Not/*.cs"
    ,
    "embed": 
      "include": "../Shared/*.resx"
    
  ,
  "packOptions": 
    "include": "Views/",
    "mappings": 
      "some/path/in/project.txt": "in/package.txt"
    
  ,
  "publishOptions": 
    "include": [
      "files/",
      "publishnotes.txt"
    ]
  


XML:
<ItemGroup>
  <Compile Include="..\\Shared\\*.cs" Exclude="..\\Shared\\Not\\*.cs" />
  <EmbeddedResource Include="..\\Shared\\*.resx" />
  <Content Include="Views\\**\\*" PackagePath="%(Identity)" />
  <None Include="some/path/in/project.txt" Pack="true" PackagePath="in/package.txt" />

  <None Include="notes.txt" CopyToOutputDirectory="Always" />
  <!-- CopyToOutputDirectory =  Always, PreserveNewest, Never  -->

  <Content Include="files\\**\\*" CopyToPublishDirectory="PreserveNewest" />
  <None Include="publishnotes.txt" CopyToPublishDirectory="Always" />
  <!-- CopyToPublishDirectory =  Always, PreserveNewest, Never  -->
</ItemGroup>

所有 MSBuild ItemGroup 元素都支持Include、Exclude 和 Remove。
可使用 PackagePath="path" 修改 .nupkg 内的包布局。
除 Content 外,大多数项组需要显式添加要包括在包中的 Pack="true"。 Content 将被置于包中的 content 文件夹,因为 <IncludeContentInPack> 属性默认设置为 true。 有关详细信息,请参阅在包中包含内容。
PackagePath="%(Identity)" 是一种将包路径设置为项目相对文件路径的快捷方法。

2.2 详细用法

官网的办法是对的,但貌似只能引用一个文件(或目录)。怎样才能引用多个文件(或目录)呢?
在网上搜索了一下,发现其实 include 等参数是可以作为数组的,另外还有includeFiles等参数。格式为——


    "buildOptions": Object 
        "compile": Object 
            "include": String or String[],
            "exclude": String or String[],
            "includeFiles": String or String[],
            "excludeFiles": String or String[],
            "builtIns": Object,
            "mappings": Object
        ,
        "embed": Object 
            "include": String or String[],
            "exclude": String or String[],
            "includeFiles": String or String[],
            "excludeFiles": String or String[],
            "builtIns": Object,
            "mappings": Object
        ,
        "copyToOutput": Object 
            "include": String or String[],
            "exclude": String or String[],
            "includeFiles": String or String[],
            "excludeFiles": String or String[],
            "builtIns": Object,
            "mappings": Object
        
    

三、高级用法

开发类库项目时,经常需要为不同目标框架建立项目文件。因源代码文件是同一份,所以这些项目文件是放在同一个目录中。这时VS2015会遇到 project.json 与 app.config冲突的问题,即.NET Framework项目本来是以app.config里的框架版本号为准的,但因目录中有 project.json 文件,于是报告框架版本不一致错误。

这时便可以利用本机制,将 .NET Core 的项目文件(.xproj、.json)移至一个子目录中,再去引用上级目录的源码文件。即 project.json 的编译文件配成——


    "buildOptions": 
        "compile": 
            "include": [
                "../**/*.cs"
            ]
    ,

其中的 **/ 表示包含子目录。

实测通过。源码参考:https://github.com/zyl910/ZylLib.UnionTypes/tree/master/examples/ConsoleExample/netcore10

参考文献

 

出处:https://www.cnblogs.com/zyl910/p/project_json_include.html

以上是关于.NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题的主要内容,如果未能解决你的问题,请参考以下文章

[asp.net core]project.json

.NET Core项目从xproj+project.json向csproj迁移简介

.NET Core系列 : 2 project.json 这葫芦里卖的什么药

使用 Visual Studio 2017 的 .NET Core 解决方案上没有 project.json、global.json ... 等

[asp.net core]project.json

[.NET Core 24]把project.json迁移到.csproj