誰かがcsprojファイル(VS2017)でこの2つの目的を説明できますか?
_<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>
_
VS2015から移行したばかりですが、1つのターゲットフレームワークのみを使用する必要があるように見えるため、Web APIを公開できません。また、複数のRIDを指定することはできません。これらの変更されたすべてのことは私をイライラさせます。ゼロから機能するものは何もなく、何度も何度も克服する必要があります。
Windowsでweb-apiを開発し、ここでxUnitテストを実行してから、web-apiをデプロイしてLinux(ubuntu)サーバーで実行したいだけです。 csprojの両方のパラメーターに何を入れるべきですか?説明の良いリンクは大歓迎です。
pdate1
参照された.netコアライブラリを持つWeb APIがあります。 VS2015から移行したすべてのもの。これでルートプロジェクトに_<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
_ができました。 VS2017経由で公開すると、エラーが発生しました:
C:\ Program Files\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets(31,5):エラー: 'Publish'ターゲットは指定せずにサポートされていませんターゲットフレームワーク。現在のプロジェクトは複数のフレームワークを対象としています。公開アプリケーションのフレームワークを指定してください。
しかし、パブリッシュでターゲットフレームワークを_netcoreapp1.1
_として指定しました。 OK。次に、csprojを以下に示すように<PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup>
で更新しました。しかし、今ではアプリをビルドすることさえできず、エラーが発生します:
5> C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\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-x64'のこのプロジェクトを復元したことを確認してください。
Windows 8.1/windows7でVS2017を使用して開発し、ubuntu 16.10にデプロイするだけです。私が間違っているのは何ですか?
pdate2
ソリューションには8つのプロジェクトがあります。それらの3つはxUnitテストです。したがって、5つのプロジェクトがあります。これら5つのうち4つはクラスライブラリであり、1つは私のWebアプリです。 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>
_
Webアプリを公開するには?
<TargetFramework>
(または<TargetFrameworks>
、1つまたは複数のnet451
など、複数のターゲットが必要な場合はnetstandard1.x
)。 <TargetFramework>
/<TargetFrameworks>
エントリごとに、アセンブリセットが1つ作成され、bin\Debug\<targetframeworkid>
内に配置されます。
これは、.NET Coreで別のライブラリを使用する場合(使用したライブラリは4.5.1などの完全な.NET Frameworkでのみ動作するため)、またはサポートされていないため.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>
(複数、<RuntimeIdentifiers>
ではなく、単一)を指定する必要があります。 、そうでない場合はエラーが発生します。
例えば:
<PropertyGroup>
<TargetFrameworks>netstandard1.0;net451</TargetFrameworks>
<RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>
<!-- This entry will only be used for the .NET Framework 4.5.1 output -->
<PropertyGroup Condition="'$(TargetFramework)' == 'net451'">
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
</PropertyGroup>
RIDはRuntime IDentifierの略です。 RIDは、アプリケーションまたは資産(つまり、アセンブリ)が実行されるターゲットオペレーティングシステムを識別するために使用されます。 「ubuntu.14.04-x64」、「win7-x64」、「osx.10.11-x64」のようになります。ネイティブの依存関係を持つパッケージの場合、パッケージを復元できるプラットフォームを指定します。
docs の詳細
最初に、適切なRIDをwin7
からwin7-x64
またはwin7-x86
に変更します。次に、ubuntuなどの他のRIDを追加します。例えば:
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>
見栄えの良いターゲットフレームワーク。詳細については docs