Как создать консольное приложение NET Core 3.1 со средой выполнения win-x64 на linux с использованием только локального источника пакета? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть особый случай, когда мне нужно создать чистый репозиторий, когда я не в сети. Мне разрешено подключать локальный канал 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

Шаги для воспроизведения:

  1. На машине разработки (Win10 1909, с do tnet 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. Внутри docker контейнера:
    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" при выполнении tnet восстановления на машине разработчика: dotnet restore --runtime win-x64 --packages $pwd\nuget "-p:DisableImplicitNuGetFallbackFolder=true".

Без разницы в результате в этом случае.

Возможный обходной путь:

Подготовьте локальный канал nuget из (другого) контейнера docker, а не непосредственно на компьютере разработчика . Однако это очень сложно, и его следует избегать, если он не нужен (он может понадобиться?).

Вопросы:

  1. Можно ли построить Консольное приложение win-x64 из Linux с локальным фидом nuget, подготовленным с машины Windows (мой подход выше)?
  2. Любые другие обходные пути или рекомендации для выполнения sh того, что я пытаюсь сделать?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...