.NET Core + MSBuild:如何将 csproj 与多个 project.json 文件相关联
本文关键字:project json 文件 关联 csproj MSBuild Core NET | 更新日期: 2023-09-27 18:34:57
edit 3:看起来我正在尝试做的事情不受支持;实际上不可能跨配置"共享"project.json文件。我正在用如何指向.NET Core PCL中的不同project.json位置来取代这个问题?
编辑2:是的,我的怀疑是正确的。 ProjectJson
和ProjectLockJson
实际上并不是特殊的 MSBuild 属性,它们的值在另一个导入的 MSBuild 项目中用于执行实际工作。当我有更新时,我会发布更多关于此的内容(希望以答案的形式(。
编辑:我已将整个项目发布到 GitHub,以便你们可以获得重现。只需git clone
存储库,在VS中打开它,开始构建,您应该遇到错误。
原始帖子
我正在尝试创建一个基于 .NET Core 的可移植类库。我在将多个 project.json 文件与我的 csproj 相关联时遇到问题。这是我的目录结构:
LibFoo
|
---- LibFoo.csproj
|
---- project.json
|
---- Platforms
|
---- Net45
| |
| ---- project.json
|
---- Profile32
|
---- project.json
我有两个MSBuild平台(不包括AnyCPU(,Net45
和Profile32
。基本上,当它设置为 .NET Framework 4.5 时,我希望它编译在根目录中包含 project.json,在 Platforms/Net45
中包含 project.json。当它设置为 Profile32
时,我希望它使用 project.json 在 Platforms/Profile32
中做到这一点。
我的问题是,我怎样才能让它在 MSBuild 中工作?这是我csproj
文件的相关片段:
<ItemGroup Condition=" '$(Platform)' == 'Net45' ">
<!-- Target WPF apps -->
<TargetPlatform Include=".NETFramework, Version=4.5" />
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'Profile32' ">
<!-- Target Windows 8.1 Universal apps -->
<TargetPlatform Include="Windows, Version=8.1" />
<TargetPlatform Include="WindowsPhoneApp, Version=8.1" />
</ItemGroup>
<ItemGroup>
<None Include="Platforms'Net45'project.json" />
<None Include="Platforms'Profile32'project.json" />
</ItemGroup>
<PropertyGroup>
<ProjectJsonRoot>Platforms'$(Platform)</ProjectJsonRoot>
<ProjectJson>$(ProjectJsonRoot)'project.json</ProjectJson>
<ProjectLockJson>$(ProjectJsonRoot)'project.lock.json</ProjectLockJson>
</PropertyGroup>
<ItemGroup>
<!-- Include a common project.json for shared configs -->
<None Include="project.json" />
</ItemGroup>
由于某种原因,ProjectJson
和ProjectLockJson
部分似乎不起作用。我怀疑他们是问题所在,因为我在MSBuild上找不到他们的任何官方文档,但CoreFX似乎在他们的csproj文件中非常成功地使用它。我做错了什么吗?
问题是你应该从.csprojs移动到.xprojs。然后,每个 .xproj 可以具有单个 project.json,可以面向多个框架。
好文章: http://blog.marcgravell.com/2015/11/the-road-to-dnx-part-1.html
这是我的示例:https://github.com/adamsitnik/BenchmarkDotNet
对于那些偶然发现这个问题寻求帮助的人,请遵循Adam Sitnik的答案。对于绝大多数用例,解决方案只是从csproj切换到xproj,因此您的project.json文件可以面向多个框架。
唉,对于我的情况(使用我的库中的 Windows 运行时 API(,不幸的是这是不可能的,因为即使您正在为其目标框架进行编译,project.json
也没有内置的方法来访问 WinRT API。例如,如果这样做:
"frameworks": {
".NETPortable,Version=v4.6,Profile32": {
"frameworkAssemblies": {
"Windows": { "type": "build" }
}
}
}
它不会编译,尽管编译器会很乐意为您找到像System.Runtime
或System.Linq
这样的程序集。
我最终在这里的 CoreFX 存储库中提出了一个关于这个问题的问题。似乎 CoreFX 团队执行此操作的方式(例如,您会在这样的项目中找到多个 project.json(是通过创建自定义 MSBuild 任务,该任务允许他们覆盖 project.json,他们将代码存储在他们的 buildtools 存储库中。
我真的无法创建自己的 MSBuild 任务,也无法使用 .NET 生成工具来构建自己的存储库,因此我最终只是以老式的方式创建多个csproj
文件。