2017-06-27 16 views
5

Tôi muốn tạo gói NuGet có thể đồng thời và nhắm mục tiêu rõ ràng cả hai Khuôn khổ .NET 4.6.2 và .Net Standard 1.5. Dưới đây là một file csproj viết tắt từ VS 2017:Xây dựng gói NuGet trên Linux nhắm mục tiêu .NET Framework

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

    <PropertyGroup> 
    <TargetFrameworks>net462;netstandard1.5</TargetFrameworks> 
    ... 
    </PropertyGroup> 

</Project> 

Khi tôi thực hiện xây dựng DotNet và lệnh gói từ máy tính Windows địa phương của tôi, gói NuGet được tạo ra hoàn toàn tốt như mong đợi.

Tuy nhiên, khi tôi cố gắng để thực thi các lệnh DotNet cùng trên Linux, tôi nhận được lỗi sau:

/opt/dotnet/sdk/1.0.4/Microsoft.Common.CurrentVersion.targets(1111,5): error MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.6.2" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.

Sau đó nó chợt nhận ra rằng tôi không có bất kỳ .NET Framework hội thường xuyên trên Vì vậy, có vẻ như tôi sẽ không thể sử dụng Linux để xây dựng gói NuGet của tôi. Tôi đã tìm kiếm một "Gói nhắm mục tiêu", nhưng nó chỉ có sẵn cho Windows. nguy cơ nghe có vẻ ngây thơ, là bất cứ ai xây dựng thành công các gói NuGet trên Linux có thể nhắm mục tiêu .NET Framewor k?

+0

Hiện tại, họ không đưa kịch bản đó vào xem xét. Vì vậy, bạn sẽ phải sử dụng Windows. –

+2

Điều này được theo dõi bởi [vấn đề về GitHub] (https://github.com/dotnet/sdk/issues/335) Tôi đã mở vài tháng trước. Tôi đã đăng một câu trả lời dựa trên các cuộc thảo luận đã xảy ra ở đó. –

+0

@MartinUllrich Cảm ơn bạn đã liên kết GitHub, đó là vô cùng nhiều thông tin. –

Trả lời

9

Phân phối .NET CLI không chứa bất kỳ bộ tham chiếu nào cho .NET Framework để phiên bản MSBuild của nó không thể giải quyết các tài sản biên dịch cần thiết. Kịch bản này là tracked on GitHub mặc dù và đã làm việc trước khi di chuyển sang MSBuild (CLI có thể sử dụng các assembly tham khảo của mono).

Có một vài lựa chọn thay thế mặc dù có thể được sử dụng để xây dựng thư viện của bạn trên máy không cửa sổ:

1. Sử dụng mono 5 + để xây dựng thư viện.

Đây có lẽ là con đường ổn định nhất.

Mono 5 trở lên chứa logic xây dựng cần thiết để xây dựng các ứng dụng .NET Standar và .NET Core. Trên linux, msbuild của mono có thể cần được cài đặt như một gói riêng biệt. Vì vậy, thay vì các lệnh sau đây thường được sử dụng

dotnet restore 
dotnet build 
dotnet publish -c Release 

bạn sẽ sử dụng msbuild mono để làm như sau: Cách giải quyết

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

Pack cho mono < 5.2:

Hạn chế duy nhất là mono (< 5.2) không thể sản xuất các gói NuGet ra khỏi hộp nhưng có một workaround involving using the NuGet.Build.Tasks.Pack NuGet package trong dự án cho phép bạn làm msbuild /t:Pack /p:Configuration=Release bởi mo difying hồ sơ dự án như thế này (đặc biệt lưu ý loại bỏ Sdk="..." thuộc tính trên các yếu tố <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. Sử dụng .NET CLI và nói với MSBuild sử dụng cụm tham khảo mono của.

Khi xây dựng cho net* khung đích, bạn có thể đặt thuộc tính FrameworkPathOverride làm biến môi trường hoặc thuộc tính trong tệp csproj. Nó cần phải trỏ đến một tập hợp các tham chiếu - các assembly tham khảo của mono có thể được sử dụng ở đây.Nhưng một số có chứa một tập tin đặc biệt (danh sách redist) chứa các tham chiếu đến các thư mục khác mà phiên bản MSBuild trong .NET CLI không thể làm theo. Nó hoạt động trong nhiều trường hợp mặc dù:

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

Điều này đã được sử dụng và documented by the F# team.

3. Sử dụng gói NuGet chứa hội đồng tham chiếu.

Trên một số nguồn cấp dữ liệu MyGet, Microsoft phát hành gói NuGet chứa các tham chiếu hội đồng. Chúng không được xuất bản hoặc "chính thức" mặc dù vậy quá trình này có thể không thành công tại một thời điểm nào đó. Tuy nhiên, họ thực hiện plan to investigate making this path official.

Đầu tiên tạo một file NuGet.Config trong thư mục của giải pháp của bạn với nội dung sau để thêm các thức ăn chăn nuôi:

<?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> 

Sau đó, bạn có thể thêm một nhóm mục để thêm PackageReference để một gói nhắm mục tiêu và một PropertyGroup để thiết lập các đường dẫn đến các hội đồng tham khảo như thế này:

<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> 

bạn có thể thay đổi RuntimeIdentifier cho các nền tảng khác nhau nếu bạn sử dụng tài sản có nguồn gốc (ví dụ như để có được .so file cho linux) hoặc loại bỏ nó hoàn toàn khi xây dựng thư viện.

Các vấn đề liên quan