C# .NET核心&x2B;MSBuild:如何将csproj与多个project.json文件关联?

C# .NET核心&x2B;MSBuild:如何将csproj与多个project.json文件关联?,c#,.net,msbuild,asp.net-core,dnx,C#,.net,Msbuild,Asp.net Core,Dnx,编辑3:看起来我试图做的事情不受支持;实际上不可能跨配置“共享”project.json文件。我用一句话来代替这个问题 编辑2:是的,我的怀疑是正确的ProjectJson和ProjectLockJson实际上不是特殊的MSBuild属性,它们的值在另一个导入的MSBuild项目中用于执行实际工作。当我有更新的时候,我会发布更多关于这方面的信息(希望以答案的形式) 编辑:我已经发布了整个项目,所以你们可以重新制作。只需git clone存储库,在VS中打开它,开始构建,您应该会遇到错误 原创帖子

编辑3:看起来我试图做的事情不受支持;实际上不可能跨配置“共享”project.json文件。我用一句话来代替这个问题

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

编辑:我已经发布了整个项目,所以你们可以重新制作。只需
git clone
存储库,在VS中打开它,开始构建,您应该会遇到错误

原创帖子

我正在尝试创建一个基于.NETCore的可移植类库。我无法将多个project.json文件与csproj关联。以下是我的目录结构:

LibFoo
|
---- LibFoo.csproj
|
---- project.json
|
---- Platforms
     |
     ---- Net45
     |    |
     |    ---- project.json
     |
     ---- Profile32
          |
          ---- project.json
我有两个MSBuild平台(不包括任何CPU),
Net45
Profile32
。基本上,当它设置为.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>

平台\$(平台)
$(ProjectJsonRoot)\project.json
$(ProjectJsonRoot)\project.lock.json

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

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

伟大的文章:


这是我的示例:

对于偶然发现这个问题寻求帮助的人,请按照答案进行操作。对于绝大多数用例,解决方案只是从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,并将代码存储在repo中


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

我只是想评论一下,因为我不确定如何正确地实现这一点,但是您应该有一个提到不同运行时的
project.json
文件。还有一个常见的部分。@moswald我一开始试过了,但遇到了一个错误:“包含MSBuild目标和props文件的包无法完全安装在目标为多个框架的项目中。”然后VS决定忽略所有的.cs文件。回答得好!问题是,我实际上正处于从XPROJ过渡到CSPROJ的中间阶段,因为当谈到使用Windows /Windows Phone 8 API时。所以,唉,使用xproj不是一个选项。@JamesKo听到这个消息我很难过。您是否尝试过使用新的dotnet cli工具链?据我所知,没有与VS的集成,但你可以在他们的回购中报告一个bug,所以也许它可以用RC-2修复,并包含在下一个VS版本中?否则我就没有别的想法了