【问题标题】:Cross-compile .NET project from Gitlab-runner to Windows将 .NET 项目从 Gitlab-runner 交叉编译到 Windows
【发布时间】:2021-12-09 09:40:58
【问题描述】:

我是 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 这样的作品,但有点不。它构建 something,但不生成 EXE 文件。我正在尝试在测试阶段重用这个构建。

deploy 阶段,我决定使用dotnet publish 而不是dotnet build,希望它可能会给我正确的结果。我尝试了许多不同的方法和许多不同的标志,但最后我无法在 GitLab 运行器上编译这个项目,因此我可以将输出文件夹复制到 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):错误 NETSDK1129:“发布”目标是不指定目标框架不支持。当前项目针对多个框架,必须指定发布的框架 申请。

所以我累了并指定这样的框架:
dotnet publish -o ../publish -f net5.0

然后我得到:

/usr/share/dotnet/sdk/5.0.402/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(241,5):错误NETSDK1005:资产文件'/builds/myuser/myrepo/ myproject/Common/obj/project.assets.json' 没有 'net5.0' 的目标。确保恢复已运行,并且您已在项目的 TargetFrameworks 中包含“net5.0”。

所以我事先也尝试过运行dotnet restore --force,但令所有人惊讶的是,这并没有改变任何事情(仍然是同样的错误)——是的,我知道无论如何都应该隐式调用 restore。

只有在我向解决方案文件添加显式路径后,它才开始“成功”编译。
dotnet publish MyProject.sln -o ../publish

但它不会生成任何EXE文件。


我错过了什么?我不知道我做错了什么。我不仅对 DevOps 还对 .NET 有点陌生。如何在 Gitlab-runner 上编译这个项目以便它可以在 Windows 上运行?

【问题讨论】:

    标签: c# .net gitlab devops cross-compiling


    【解决方案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
    

    【讨论】:

    • 那也没用。 /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.
    • @AnJ 错误表明您正在尝试发布一个不是控制台应用程序或 Web 应用程序的项目。
    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2023-01-27
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多