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

时间:2016-02-17 00:57:14

标签: c# .net msbuild asp.net-core dnx

编辑3:看起来我尝试做的事情并不受支持;它实际上不可能分享'跨配置的project.json文件。我用How to point to a different project.json location in a .NET Core PCL?

取代了这个问题

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

编辑:我已发布了整个项目to 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时,我希望它与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文件中使用它非常成功。我做错了吗?

2 个答案:

答案 0 :(得分:3)

问题是你应该从.csprojs转移到.xprojs。然后每个.xproj都可以有一个可以定位多个框架的project.json。

好文章:http://blog.marcgravell.com/2015/11/the-road-to-dnx-part-1.html

以下是我的示例:https://github.com/adamsitnik/BenchmarkDotNet

答案 1 :(得分:0)

对于偶然发现此问题寻求帮助的人,请按Adam Sitnik's回答。对于绝大多数用例,解决方案只是从csproj切换到xproj,因此你的project.json文件可以定位多个框架。

唉,对于我的情况(使用我的库中的Windows运行时API),遗憾的是这是不可能的,因为project.json没有内置的方法来访问WinRT API,即使你正在编译为他们的目标框架。例如,如果您这样做:

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

它不会编译,尽管编译器会很乐意为您找到System.RuntimeSystem.Linq等程序集。

我最终在CoreFX repo here上提出了一个问题。看起来CoreFX团队这样做的方式(例如你会在像this这样的项目中找到多个project.jsons)是通过创建一个自定义的MSBuild任务来允许他们覆盖他们存储的project.json他们buildtools回购中的代码。

我没有真正创建自己的MSBuild任务,也没有使用.NET构建工具来构建我自己的仓库,所以我最终只是以老式的方式创建了多个csproj文件。