.NET Core項目修改project.json來引用其餘目錄下的源碼等文件的辦法 & 解決多框架時 project.json 與 app.config衝突的問題

做者: zyl910html

1、原因

項目規模大了後,常常會出現源碼文件分佈在不一樣目錄的狀況,但.NET Core項目默認只有項目目錄下的源碼文件,且不支持「Add As Link」方式引入文件。這時須要手工修改project.json文件了。
多是由於最新版本已將 project.json 轉爲 .csproj,致使我花了一些功夫才找到配置辦法,故寫了這篇筆記。git

2、引用其餘目錄下的源碼等文件的辦法

2.1 官網說明

官網的 project.json 和 csproj 屬性之間的映射 裏簡單介紹瞭如何增長其餘的引用文件。github

文件在 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等參數。格式爲——json

{
    "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
        }
    }
}

3、高級用法

開發類庫項目時,常常須要爲不一樣目標框架創建項目文件。因源代碼文件是同一份,因此這些項目文件是放在同一個目錄中。這時VS2015會遇到 project.json 與 app.config衝突的問題,即.NET Framework項目原本是以app.config裏的框架版本號爲準的,但因目錄中有 project.json 文件,因而報告框架版本不一致錯誤。數組

這時即可以利用本機制,將 .NET Core 的項目文件(.xproj、.json)移至一個子目錄中,再去引用上級目錄的源碼文件。即 project.json 的編譯文件配成——markdown

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

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

實測經過。源碼參考:https://github.com/zyl910/ZylLib.UnionTypes/tree/master/examples/ConsoleExample/netcore10框架

參考文獻

 

出處:https://www.cnblogs.com/zyl910/p/project_json_include.htmlasp.net

相關文章
相關標籤/搜索