我有一个特殊的用例,我需要在离线时构建一个干净的存储库。我被允许附加本地 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
重现步骤:
- 在开发机器上(Win10 1909,使用 dotnet SDK 3.1.302):
mkdir dotnetTest
cd dotnetTest
dotnet new console
dotnet restore --runtime win-x64 --packages $pwd\nuget
- 此时,nuget 文件夹包含以下内容(因为这只是一个最小示例):
microsoft.aspnetcore.app.runtime.win-x64
microsoft.netcore.app.runtime.win-x64
microsoft.windowsdesktop.app.runtime.win-x64
docker run --rm -it -v $pwd`:/repo -v $pwd\nuget`:/nuget mcr.microsoft.com/dotnet/core/sdk:3.1.302-alpine3.12
- 码头集装箱内部:
dotnet nuget disable source nuget.org
dotnet nuget add source /nuget --name local
cd repo
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 提要,而不是直接在开发计算机上。然而,这更加复杂,如果不需要(可能需要?)应该避免。
问题:
- 是否可以使用从 Windows 机器准备的本地 nuget 提要从 Linux 构建一个 win-x64 控制台应用程序(我上面的方法)?
- 任何其他解决方法或指导来完成我尝试做的事情?