【问题标题】:.NET Core + MSBuild: How to associate a csproj with multiple project.json files?.NET Core + MSBuild:如何将 csproj 与多个 project.json 文件相关联?
【发布时间】:2016-02-17 00:57:13
【问题描述】:

编辑 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 文件的相关sn-p:

<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 文件中非常成功地使用了它。我做错了吗?

【问题讨论】:

  • 我只是要发表评论,因为我不确定 正确 的方法来完成这项工作,但你应该有一个 project.json 文件这提到了不同的运行时。还有一个公共部分。
  • @moswald 我起初尝试过,但我收到此错误:“包含 MSBuild 目标和道具文件的包无法完全安装在针对多个框架的项目中。”然后 VS 就决定忽略所有的 .cs 文件。

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


【解决方案1】:

问题是您应该从 .csprojs 迁移到 .xprojs。然后每个 .xproj 可以有一个 project.json 可以针对多个框架。

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

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

【讨论】:

  • 很好的答案!问题是,我实际上正在从 xproj 过渡到 csproj,因为 xproj has trouble 在使用 Windows/Windows Phone 8 API 时。唉,使用 xproj 不是一种选择。
  • @JamesKo 很遗憾听到这个消息。您是否尝试过使用新的 dotnet cli 工具链?据我所知,没有与 VS 集成,但你可以在他们的仓库中报告一个错误,所以也许它可以用 RC-2 修复并包含在下一个 VS 版本中?否则我没有其他想法
【解决方案2】:

对于偶然发现此问题寻求帮助的人,请关注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 回购 here 上提出了一个关于此的问题。似乎 CoreFX 团队这样做的方式(例如,您会在像 this 这样的项目中找到多个 project.json)是通过创建一个自定义 MSBuild 任务来允许他们覆盖他们存储代码的 project.json在他们的buildtools repo 中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 2023-01-12
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多