编辑3:看起来我尝试做的事情并不受支持;它实际上不可能分享'跨配置的project.json文件。我用How to point to a different project.json location in a .NET Core PCL?
取代了这个问题 编辑2:是的,我的怀疑是正确的。 ProjectJson
和ProjectLockJson
实际上并不是特殊的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),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>
出于某种原因,ProjectJson
和ProjectLockJson
部分似乎无法正常工作。我怀疑他们是问题,因为我无法在MSBuild找到任何官方文档,但CoreFX似乎在他们的csproj文件中使用它非常成功。我做错了吗?
答案 0 :(得分:3)
问题是你应该从.csprojs转移到.xprojs。然后每个.xproj都可以有一个可以定位多个框架的project.json。
好文章:http://blog.marcgravell.com/2015/11/the-road-to-dnx-part-1.html
答案 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.Runtime
或System.Linq
等程序集。
我最终在CoreFX repo here上提出了一个问题。看起来CoreFX团队这样做的方式(例如你会在像this这样的项目中找到多个project.jsons)是通过创建一个自定义的MSBuild任务来允许他们覆盖他们存储的project.json他们buildtools回购中的代码。
我没有真正创建自己的MSBuild任务,也没有使用.NET构建工具来构建我自己的仓库,所以我最终只是以老式的方式创建了多个csproj
文件。