• [C#] .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="..SharedNot*.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

    参考文献

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/zyl910/p/project_json_include.html
Copyright © 2020-2023  润新知