.NET Core RuntimeIdentifier vs TargetFramework
Может кто-то объяснить цель этих двух в файле csproj (VS2017):
<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>
Я просто перешел из VS2015 и теперь не могу опубликовать свой веб-api, потому что, похоже, я должен использовать только одну целевую структуру. Кроме того, я не могу указать несколько RID. Все эти измененные вещи меня расстраивают. Ничто не работает с нуля, нужно что-то преодолевать снова и снова.
Я просто хочу разработать свой веб-api на windows, запустить тесты xUnit, а затем развернуть web-api для запуска на сервере linux (ubuntu). Что мне следует включить в оба параметра в csproj? Ссылки с хорошим объяснением высоко ценятся.
Update1
У меня есть веб-api с указанными основными библиотеками.net. Все, что перенесено из 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): ошибка: цель "Опубликовать" не поддерживается без указания целевой структуры. Текущий проект рассчитан на несколько рамок, пожалуйста, укажите рамки для опубликованного приложения.
Но я указал целевую структуру в публикации как netcoreapp1.1
. ХОРОШО. Затем я обновил свой 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'.
Я просто хочу разработать с VS2017 в Windows 8.1/Windows 7 и развернуть на ubuntu 16.10. Что я делаю неправильно?
Update2
У меня есть 8 проектов в решении. 3 из них - тесты xUnit. Таким образом, у нас есть 5 проектов. 4 из этих 5 являются библиотеками классов, а 1 - моим веб-приложением. Все 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>
Как опубликовать мое веб-приложение?
Ответы
Ответ 1
<TargetFramework>
(или <TargetFrameworks>
если вы хотите иметь несколько целей, например net451
, один или несколько netstandard1.x
т.д.). В записи <TargetFramework>
/<TargetFrameworks>
будет создан один набор сборок и будет находиться внутри bin\Debug\<targetframeworkid>
).
Это полезно, если вы хотите использовать другую библиотеку в.NET Core (потому что библиотека, которую вы использовали, работает только с полной.NET Framework, такой как 4.5.1), или удалите эту функцию из.NET Core, потому что она не поддерживается.
Он используется как для восстановления зданий, так и для восстановления NuGet. т.е. вы не можете использовать только библиотеку net451
в проекте.NET Core (например, 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>
сделает пакеты восстановления <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>
для версий win7 (x64 и x86) и x64 только для ubuntu. Это необходимо, потому что, когда вы работаете с окнами, вам необходимо также загрузить эти родные библиотеки, чтобы вы разворачивали их /dotnet publish
.
Здесь немного уловить: когда у вас есть полная ссылка.NET Framework в <TargetFramework>
или <TargetFrameworks>
, тогда вы должны указать один <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>
Ответ 2
RID является коротким для идентификатора времени выполнения. RID используются для идентификации целевых операционных систем, в которых будет выполняться приложение или актив (то есть сборка). Они выглядят так: "ubuntu.14.04-x64", "win7-x64", "osx.10.11-x64". Для пакетов с родными зависимостями он будет определять, на каких платформах пакет может быть восстановлен.
Больше в документах
Сначала измените правильное RID от win7
до win7-x64
или win7-x86
. Затем добавьте другой RID, такой как ubuntu. Например:
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>
Целевая структура выглядит хорошо. Для более читаемых документов