GNU/Linux >> Linux の 問題 >  >> Linux

Linux で .NET Framework をターゲットとする NuGet パッケージをビルドする

以下をプロジェクト ファイルに追加するだけです:

  <ItemGroup Condition="$(TargetFramework.StartsWith('net4')) AND '$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">
    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
  </ItemGroup>

これにより、Windows 以外のシステムで .NET Framework のビルドとパックが可能になります。ただし、dotnet を使用して .NET Core ターゲットのみを実行できます。 Windows 以外のシステムでの CLI。したがって、次のように、Windows 以外のシステムで実行するターゲット フレームワークを選択する準備もできている必要があります。

dotnet run -f netcoreapp2.1

解決策のソース:https://github.com/dotnet/designs/pull/33#issuecomment-489264196.これは回避策であるため、将来変更される可能性があります。


.NET CLI の配布には .NET Framework の参照アセンブリが含まれていないため、そのバージョンの MSBuild は必要なコンパイル時のアセットを解決できません。ただし、このシナリオは GitHub で追跡されており、MSBuild への移行前に機能していました (CLI は mono の参照アセンブリを使用できます)。

ただし、Windows 以外のマシンでライブラリを構築するために使用できるいくつかの代替手段があります:

<強い>1.ライブラリの構築には mono 5+ を使用してください。

これはおそらく最も安定したパスです。

Mono 5 以降には、.NET Standard および .NET Core アプリケーションをビルドするために必要なビルド ロジックが含まれています。 Linux では、mono の msbuild を別のパッケージとしてインストールする必要がある場合があります。したがって、次の一般的に使用されるコマンドの代わりに

dotnet restore
dotnet build
dotnet publish -c Release

次のことを行うには、mono の msbuild を使用します:

msbuild /t:Restore
msbuild
msbuild /t:Publish /p:Configuration=Release

mono <5.2 のパックの回避策:

唯一の制限は、mono (<5.2) はそのままでは NuGet パッケージを生成できないことですが、NuGet.Build.Tasks.Pack を使用する回避策があります。 msbuild /t:Pack /p:Configuration=Release を実行できるプロジェクトの NuGet パッケージ プロジェクト ファイルを次のように変更します (特に、削除された Sdk="..." に注意してください)。 <Project> の属性 要素):

<Project>
  <PropertyGroup>
    <NuGetBuildTasksPackTargets>junk-value-to-avoid-conflicts</NuGetBuildTasksPackTargets>
  </PropertyGroup>
  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

  <!-- All your project's other content here -->

  <ItemGroup>
    <PackageReference Include="NuGet.Build.Tasks.Pack" Version="4.0.0" PrivateAssets="All" />
  </ItemGroup>
  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

<強い>2. .NET CLI を使用して、モノの参照アセンブリを使用するように MSBuild に指示します。

net* 用にビルドする場合 ターゲット フレームワークでは、FrameworkPathOverride を設定できます プロパティは、環境変数または csproj ファイルのプロパティの両方として使用できます。一連の参照アセンブリを指す必要があります。mono の参照アセンブリをここで使用できます。ただし、.NET CLI の MSBuild バージョンが追跡できない他のディレクトリへの参照を含む特別なファイル (再配布リスト) が含まれているものもあります。ただし、多くのシナリオで機能します:

export FrameworkPathOverride=/usr/lib/mono/4.5/
dotnet build -f net45

これは F# チームによって使用され、文書化されました。

<強い>3.参照アセンブリを含む NuGet パッケージを使用してください。

一部の MyGet フィードでは、Microsoft は参照アセンブリを含む NuGet パッケージを公開しています。ただし、公開されていないか「公式」ではないため、このプロセスはある時点で失敗する可能性があります。ただし、このパスを公式にすることを調査する予定です。

まず、ソリューションのディレクトリに NuGet.Config ファイルを作成し、次の内容でフィードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
    <add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
 </packageSources>
</configuration>

次に、項目グループを追加して PackageReference を追加できます ターゲティング パックと PropertyGroup 次のように参照アセンブリへのパスを設定するには:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
    <FrameworkPathOverride>$(NuGetPackageFolders)microsoft.targetingpack.netframework.v4.6.1\1.0.1\lib\net461\</FrameworkPathOverride>
  </PropertyGroup>

  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <PackageReference Include="Microsoft.TargetingPack.NETFramework.v4.6.1" Version="1.0.1" ExcludeAssets="All" PrivateAssets="All" />
  </ItemGroup>

</Project>

RuntimeIdentifier を変更できます ネイティブ アセットを使用する場合は、さまざまなプラットフォーム用 (例:.so を取得する場合) Linux 用のファイル) またはライブラリをビルドするときに完全に削除してください。


Linux
  1. aptによるLinuxパッケージ管理

  2. rpmパッケージをビルドする方法

  3. LinuxRPMパッケージを作成する方法

  1. Linuxパッケージマネージャー:dnf vs apt

  2. Nuget への SSL 認証が原因で、docker linux コンテナーの .NET Core ビルドが失敗する

  3. dbgパッケージを生成せずにLinuxカーネルdeb-pkgターゲットをコンパイルしますか?

  1. Linuxで特定のファイルを提供するパッケージを見つける方法

  2. Linux – Kaliにヘッダーをインストールしますか?

  3. Linux の Visual Basic .Net