作者: "zyl910" 一、緣由 項目規模大了後,經常會出現源碼文件分佈在不同目錄的情況,但.NET Core項目預設只有項目目錄下的源碼文件,且不支持“Add As Link”方式引入文件。這時需要手工修改project.json文件了。 可能是因為最新版本已將 project.json 轉為 ...
作者: 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
參考文獻
- 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