有人可以在csproj文件(VS2017)中解释这两个目的:
<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>
我刚从VS2015迁移,现在无法发布我的web api,因为它看起来我应该只使用一个目标框架。另外我不能指定多个RID。 所有这些改变的事情让我感到沮丧。没有什么可以从头开始,应该一遍又一遍地克服一些东西。
我只想在Windows上开发我的web-api,在这里运行xUnit测试,然后部署web-api以在linux(ubuntu)服务器上运行。 我应该在csproj的两个参数中加入什么? 非常感谢与良好解释的链接。
UPDATE1
我有带引用的.net核心库的web api。从VS2015迁移的所有东西。现在我有根项目
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
。当我通过VS2017发布时出现错误:
C:\程序 文件\ DOTNET \ SDK \ 1.0.3 \的SDK \ Microsoft.NET.Sdk \ buildCrossTargeting \ Microsoft.NET.Sdk.targets(31,5): 错误:如果未指定a,则不支持“发布”目标 目标框架。当前项目针对多个框架, 请指定已发布申请的框架。
但是我已将发布中的目标框架指定为netcoreapp1.1
。
好。然后我按照下面的建议用<PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'">
<RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>
更新了我的csproj。
但现在我甚至无法构建app,得到错误:
5&gt; C:\ Program Files(x86)\ Microsoft Visual 工作室\ 2017 \企业\的MSBuild \的SDK \ Microsoft.NET.Sdk \建立\ Microsoft.NET.Sdk.targets(92.5): 错误:资产文件'\ obj \ project.assets.json'没有 有一个'.NETCoreApp,Version = v1.1 / ubuntu.16.10-x64'的目标。确保 你已经为TargetFramework ='netcoreapp1.1'恢复了这个项目 RuntimeIdentifier = 'ubuntu.16.10-64'。
我只想在Windows 8.1 / windows7上使用VS2017进行开发并部署到ubuntu 16.10。 我做错了什么?
UPDATE2
我有8个项目在解决方案中。其中3个是xUnit测试。因此我们有5个项目。这5个中的4个是类库,1个是我的web-app。 所有4个类库都有:
<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
我的网络应用:
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
如何发布我的网络应用程序?
答案 0 :(得分:15)
<TargetFramework>
(或<TargetFrameworks>
,如果您想要多个目标,例如net451
,一个或多个netstandard1.x
等。每<TargetFramework>
/ <TargetFrameworks>
个条目将创建一组程序集并位于bin\Debug\<targetframeworkid>
内。
当您想在.NET Core中使用不同的库(因为您使用的库仅适用于完整的.NET Framework,如4.5.1)或从.NET Core中删除此功能时,这很有用,因为它不受支持。
它用于构建和NuGet还原。即,您不能在.NET Core项目中使用仅net451
库(例如netstandard 1.1
- 但您可以在netstandard1.1
项目中使用net451
)
<RuntimeIdentifier>
/ <RuntimeIdentifiers>
主要用于NuGet。它告诉NuGet您需要哪些包。例如,如果您想要定位Linux,Mac和Windows,某些程序集需要本机库(例如加密。在Windows上将使用CryptoAPI,但在Linux和Mac上则需要OpenSSL)。这包括非托管dll和* .so(Linux)文件。
即。 <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>
将为win7(x64和x86)版本生成nuget恢复包,仅为ubuntu生成x64。这是必需的,因为当您在Windows上工作时,您还需要下载这些本机库,以便使用dotnet publish
部署/打包它们。
虽然这里有一点看法:当你在<TargetFramework>
或<TargetFrameworks>
中有完整的.NET Framework参考时,你必须指定一个<RuntimeIdentifier>
(单数,而不是复数{{1} }),否则你会得到一个错误。
例如:
<RuntimeIdentifiers>
答案 1 :(得分:1)
中的更多内容RID是Runtime IDentifier的缩写。 RID用于识别目标 应用程序或资产(即程序集)的操作系统 会跑。它们看起来像这样:“ubuntu.14.04-x64”,“win7-x64”, “osx.10.11-64”。对于具有本机依赖关系的包,它会 指定可以恢复包的平台。
首先更改为win7
到win7-x64
或win7-x86
的正确RID。接下来添加像ubuntu这样的其他RID。例如:
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>
目标框架看起来不错。更多阅读docs