1

我有一个特殊的用例,我需要在离线时构建一个干净的存储库。我被允许附加本地 nuget 提要并在本地提供标准 docker 映像。

构建容器基于 linux。

我正在寻找的解决方案涉及使用 dotnet restore 准备本地 nuget 提要,然后在 linux 容器内使用指定的 nuget 源执行 dotnet 构建。

我正在为 win-x64 运行时构建。

环境:

$ dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   3.1.302
 Commit:    41faccf259

Runtime Environment:
 OS Name:     alpine
 OS Version:  3.12
 OS Platform: Linux
 RID:         linux-musl-x64
 Base Path:   /usr/share/dotnet/sdk/3.1.302/

Host (useful for support):
  Version: 3.1.6
  Commit:  3acd9b0cd1

.NET Core SDKs installed:
  3.1.302 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.6 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

预期结果:

在 docker linux 容器内成功构建。

实际结果:

error NU1101: Unable to find package Microsoft.NETCore.App.Host.win-x64. No packages exist with this id in source(s): local

重现步骤:

  1. 在开发机器上(Win10 1909,使用 dotnet SDK 3.1.302):
    1. mkdir dotnetTest
    2. cd dotnetTest
    3. dotnet new console
    4. dotnet restore --runtime win-x64 --packages $pwd\nuget
    5. 此时,nuget 文件夹包含以下内容(因为这只是一个最小示例):
      1. microsoft.aspnetcore.app.runtime.win-x64
      2. microsoft.netcore.app.runtime.win-x64
      3. microsoft.windowsdesktop.app.runtime.win-x64
    6. docker run --rm -it -v $pwd`:/repo -v $pwd\nuget`:/nuget mcr.microsoft.com/dotnet/core/sdk:3.1.302-alpine3.12
  2. 码头集装箱内部:
    1. dotnet nuget disable source nuget.org
    2. dotnet nuget add source /nuget --name local
    3. cd repo
    4. dotnet build --runtime win-x64

最后一个命令导致:

Microsoft (R) Build Engine version 16.6.0+5ff7b0c9e for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
/repo/dotnetTest.csproj : error NU1101: Unable to find package Microsoft.NETCore.App.Host.win-x64. No packages exist with this id in source(s): local
  Failed to restore /repo/dotnetTest.csproj (in 988 ms).

Build FAILED.

/repo/dotnetTest.csproj : error NU1101: Unable to find package Microsoft.NETCore.App.Host.win-x64. No packages exist with this id in source(s): local
    0 Warning(s)
    1 Error(s)

有趣的部分突出显示:error NU1101: Unable to find package Microsoft.NETCore.App.Host.win-x64. No packages exist with this id in source(s): local

我还应该提到,启动一个新容器并运行,cd repo然后dotnet build --runtime win-x64运行没有问题(丢失Microsoft.NETCore.App.Host.win-x64的内容已被下载)。

经测试的解决方法:

我曾尝试"-p:DisableImplicitNuGetFallbackFolder=true"在开发人员机器上使用 dotnet restore 时: dotnet restore --runtime win-x64 --packages $pwd\nuget "-p:DisableImplicitNuGetFallbackFolder=true".

在这种情况下,结果没有区别。

可能的解决方法:

从(另一个)docker 容器中准备本地 nuget 提要,而不是直接在开发计算机上。然而,这更加复杂,如果不需要(可能需要?)应该避免。

问题:

  1. 是否可以使用从 Windows 机器准备的本地 nuget 提要从 Linux 构建一个 win-x64 控制台应用程序(我上面的方法)?
  2. 任何其他解决方法或指导来完成我尝试做的事情?
4

0 回答 0