做者: 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框架
參考文獻
- Microsoft《project.json 和 csproj 屬性之間的映射》. https://docs.microsoft.com/zh-cn/dotnet/core/tools/project-json-to-csproj
- Wolf《[asp.net core]project.json(1)》. http://www.cnblogs.com/wolf-sun/p/5987252.html
- 【內容已過期】aspnet《Project.json file》. https://github.com/aspnet/Home/wiki/Project.json-file