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

4

编辑3: 看起来我的尝试不被支持;在不同的配置之间“共享”project.json文件实际上是不可能的。我将用如何在.NET Core PCL中指向另一个project.json位置?替换这个问题。

编辑2: 是的,我的猜测是正确的。 ProjectJsonProjectLockJson并不是特殊的MSBuild属性,它们的值被用于另一个导入的MSBuild项目中进行实际工作。当我有更新时(希望以答案的形式),我会发布更多信息。

编辑: 我已经将整个项目发布到GitHub,这样你们就可以获取重现了。只需克隆存储库,在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 时,我希望它在 Platforms/Profile32中使用 project.json 来编译。
我的问题是:如何在 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文件中似乎可以很成功地使用它。我做错了什么吗?

1
我只是想评论一下,因为我不确定让它正常工作的正确方法,但是你应该有一个单独的 project.json 文件,其中提到了不同的运行时。还有一个公共部分。 - moswald
@moswald,我一开始也尝试了那个方法,但是出现了这个错误:'Packages containing MSBuild targets and props files cannot be fully installed in projects targeting multiple frameworks.' 然后VS就决定忽略所有的.cs文件。 - James Ko
2个回答

3

很棒的答案!问题是,我正在从xproj过渡到csproj的中间阶段,因为xproj在使用Windows/Windows Phone 8 API时存在问题。所以,遗憾的是,不能使用xproj。 - James Ko
@JamesKo 很抱歉听到这个消息。您尝试过使用新的dotnet cli工具链吗?据我所知,它与VS没有集成,但您可以在他们的repo中报告错误,以便在RC-2中修复,并包含在下一个VS版本中。否则,我没有其他想法。 - Adam Sitnik

0

对于那些在寻求帮助的人,请参考Adam Sitnik的答案。对于绝大多数情况,解决方案只是从csproj切换到xproj,这样您的project.json文件就可以针对多个框架进行目标设置。

然而,对于我的情况(即从我的库中使用Windows Runtime API),这是不可能的,因为project.json没有内置的方法来访问WinRT API,即使您正在为其目标框架编译。例如,如果您执行以下操作:

"frameworks": {
    ".NETPortable,Version=v4.6,Profile32": {
        "frameworkAssemblies": {
            "Windows": { "type": "build" }
        }
    }
}

虽然编译器可以轻松找到像System.RuntimeSystem.Linq这样的程序集,但它无法编译。

最终我在CoreFX repo 这里提出了一个问题。看起来CoreFX团队是通过创建自定义MSBuild任务来实现这一点(例如,您将在像这个这样的项目中找到多个project.json),这使他们能够覆盖project.json,并将其存储在他们的buildtools repo中。

我并不想创建自己的MSBuild任务,也不想使用.NET构建工具来构建自己的repo,所以最终我只是老式地创建了多个csproj文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接