У меня есть особый случай, когда мне нужно создать чистый репозиторий, когда я не в сети. Мне разрешено подключать локальный канал nuget и иметь локально доступное стандартное изображение docker.
Контейнер сборки основан на linux.
Решение, которое я ищу включает подготовку локального канала nuget с восстановлением do tnet, а затем внутри контейнера linux выполнение сборки do tnet с указанным источником nuget.
Я создаю для среды выполнения 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, с do tnet 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
- Внутри docker контейнера:
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"
при выполнении tnet восстановления на машине разработчика: dotnet restore --runtime win-x64 --packages $pwd\nuget "-p:DisableImplicitNuGetFallbackFolder=true"
.
Без разницы в результате в этом случае.
Возможный обходной путь:
Подготовьте локальный канал nuget из (другого) контейнера docker, а не непосредственно на компьютере разработчика . Однако это очень сложно, и его следует избегать, если он не нужен (он может понадобиться?).
Вопросы:
- Можно ли построить Консольное приложение win-x64 из Linux с локальным фидом nuget, подготовленным с машины Windows (мой подход выше)?
- Любые другие обходные пути или рекомендации для выполнения sh того, что я пытаюсь сделать?