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.
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. –
Đ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 ở đó. –
@MartinUllrich Cảm ơn bạn đã liên kết GitHub, đó là vô cùng nhiều thông tin. –