作者:
一、缘由
项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持“Add As Link”方式引入文件。这时需要手工修改project.json文件了。
可能是因为最新版本已将 project.json 转为 .csproj,导致我花了一些功夫才找到配置办法,故写了这篇笔记。二、引用其他目录下的源码等文件的办法
2.1 官网说明
官网的 里简单介绍了如何增加其他的引用文件。
文件在 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:所有 MSBuild ItemGroup 元素都支持Include、Exclude 和 Remove。可使用 PackagePath="path" 修改 .nupkg 内的包布局。除 Content 外,大多数项组需要显式添加要包括在包中的 Pack="true"。 Content 将被置于包中的 content 文件夹,因为 属性默认设置为 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" ] },}
其中的 **/
表示包含子目录。
实测通过。
参考文献
- Microsoft《project.json 和 csproj 属性之间的映射》.
- Wolf《[asp.net core]project.json(1)》.
- 【内容已过时】aspnet《Project.json file》.