# #c# #.net #gitlab #devops #cross-compiling
Вопрос:
Я новичок в DevOps. Я пытаюсь настроить конвейер автоматического развертывания для проекта .NET. Я хотел бы создать этот проект и скопировать его на удаленную машину Windows для ручного тестирования.
Я выполнил большую часть своей работы. Но моя самая большая проблема (я думаю) связана с перекрестной компиляцией. Все это просто работает на моем компьютере с Windows (я могу создавать и запускать проект с помощью IDE), но я не могу правильно скомпилировать его на GitLab-runner.
У меня есть следующая .gitlab-ci.yml
конфигурация:
image: mcr.microsoft.com/dotnet/sdk:5.0 stages: - build - test - deploy build_job: stage: build script: - dotnet build -o ../build artifacts: paths: - build test_job: stage: test script: - dotnet test --no-build -o ../build deploy_job: stage: deploy rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH script: - dotnet publish MyProject.sln -o ../publish # copy ../publish to a remote server
Я прокомментировал последнюю часть, так как она не имеет отношения к делу (она просто копирует файлы с sftp
).
У меня есть сцена build
такого рода работ, но вроде как нет. Он что-то создает, но не генерирует EXE-файлы. И я пытаюсь повторно использовать эту сборку на этапе тестирования.
На deploy
этапе я решил использовать dotnet publish
вместо dotnet build
того, чтобы надеяться, что, возможно, это даст мне правильный результат. Я пробовал много разных подходов и много разных флагов, но в конце концов я просто не могу скомпилировать этот проект на GitLab runner, чтобы скопировать выходную папку на компьютер с Windows и запустить EXE-файл.
Если я побегу
dotnet publish -o ../publish
Я получаю:
/usr/share/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.CrossTargeting.targets(27,5): error NETSDK1129: The ‘Publish’ target is not supported without specifying a target framework. The current project targets multiple frameworks, you must specify the framework for the published application.
Поэтому я устал и определяю рамки так:
dotnet publish -o ../publish -f net5.0
Но потом я получаю:
/usr/поделиться/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.Sdk/цели/Microsoft.PackageDependencyResolution.targets(241,5): ошибка NETSDK1005: Файл ресурсов «/сборки/myuser/myrepo/myproject/Общий/obj/project.assets.json» не имеет цели для «net5.0». Убедитесь, что восстановление запущено и что вы включили «net5.0» в целевую структуру для своего проекта.
Поэтому я попытался также запустить dotnet restore --force
заранее, но, к всеобщему удивлению, это ничего не изменило (все та же ошибка) — да, я знаю, что восстановление в любом случае должно быть вызвано неявно.
Он начал «успешно» компилироваться только после того, как я добавил явный путь к своему файлу решения.
dotnet publish MyProject.sln -o ../publish
Но он не генерирует никаких исполняемых файлов.
Что я упускаю? Я не знаю, что я делаю не так. Я вроде как новичок не только в DevOps, но и .СЕТЬ тоже. Как я могу скомпилировать этот проект на Gitlab-runner, чтобы он работал в Windows?
Ответ №1:
Вы должны указать команду .csproj
файл для публикации, а также рассмотреть формат Runtime Identifier (RID)
вывода (для Windows 8 RID-win8-x64, и он генерирует файл .exe) следующим образом:
script: - dotnet restore path/to/yourProject.csproj - dotnet publish path/to/yourProject.csproj -c Release -r win8-x64 -o ../build
Комментарии:
1. Это тоже не сработало.
/usr/share/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(993,5): error NETSDK1150: The referenced project '../MyProject.SubProject/MyProject.SubProject.csproj' is a non self-contained executable. A non self-contained executable cannot be referenced by a self-contained executable.
2. @AnJ Ошибка говорит о том, что вы пытаетесь опубликовать проект, который не является консольным приложением или веб-приложением.