.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:是的,我的怀疑是正确的。 ProjectJsonProjectLockJson实际上并不是特殊的 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(,Net45Profile32。基本上,当它设置为 .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>

由于某种原因,ProjectJsonProjectLockJson部分似乎不起作用。我怀疑他们是问题所在,因为我在MSBuild上找不到他们的任何官方文档,但CoreFX似乎在他们的csproj文件中非常成功地使用它。我做错了什么吗?

.NET Core + MSBuild:如何将 csproj 与多个 project.json 文件相关联

问题是你应该从.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.RuntimeSystem.Linq这样的程序集。

我最终在这里的 CoreFX 存储库中提出了一个关于这个问题的问题。似乎 CoreFX 团队执行此操作的方式(例如,您会在这样的项目中找到多个 project.json(是通过创建自定义 MSBuild 任务,该任务允许他们覆盖 project.json,他们将代码存储在他们的 buildtools 存储库中。

我真的无法创建自己的 MSBuild 任务,也无法使用 .NET 生成工具来构建自己的存储库,因此我最终只是以老式的方式创建多个csproj文件。