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

    参考文献

  • 相关阅读:
    有感于《CommunityServer 2007 beta》版本的发布
    企业内部办公自动化之---预定系统
    企业办公自动化之三--内部网的部分实现
    推荐一个超人气的类似MSN弹出的控件
    如何创建类型FreeTextBox的编辑器
    输出EXCEL文件的通用函数,很实用
    ASP导出Excel数据的四种方法
    常用的一些工具总结
    ASP2DLL工具
    分層排序的SQL
  • 原文地址:https://www.cnblogs.com/zyl910/p/project_json_include.html
Copyright © 2020-2023  润新知