Dot-Net-Core

gitlab CI 上的 dotnet pack 或 nuget pack

  • September 10, 2020

我正在使用 GitLab,我需要創建一個.gitlab-ci.yml腳本來為生成 nuGet 包的項目執行持續集成管道。

我在尋找可靠的文件來回答這個問題時遇到了嚴重的問題:

我應該使用dotnet packornuget pack嗎?

nuget.exe 不能作為命令使用,除非我的 CI 腳本下載它(我正在使用 GitLab,所以我必須添加一些東西.gitlab-ci.yml才能這樣做)。我的理解是dotnet隱式使用 nuget,因此無需直接使用 nuget。

dotnet pack 命令的問題是我無法引用 nuspec 文件,它被簡單地忽略了。

我試過了

dotnet pack 'MyProject.Nuget/MyProject.Nuget.csproj' /p:NuspecFile='MyProject.Nuget/MyProject.NuGet.nuspec' /p:PackageVersion=$VERSION --output nupkgs

任何關於最新版本(dotnet --version2.1.401)的正確方法的可靠文件將不勝感激,因為我無法創建包含多個 dll 的有效 nuGet 包。

更新:替代方法是:

nuget pack ./*NuGet/*.nuspec -Version $VERSION -OutputDirectory pepe -Prop Configuration=Release -NoDefaultExcludes -Verbosity detailed

我現在從 GitLab 的 CI/CD 成功為我的 dotnet 核心應用程序建構了 nuGet 包。

需要考慮的事項:

  • 路徑很重要:我的 nuspec 具有\windows 樣式的路徑。我需要將它們更改為 linux-style /。確保您的文件 src 部分引用了指定路徑中存在的 dll 和 pdb,否則在創建 nuget 時會出現異常,因為它找不到任何東西。所以我的 nuspec 現在看起來像這樣:
<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
 <metadata>
   <id>ToolBelt.Application</id>
   <version>1.0.0</version>
   <authors>TUI</authors>
   <requireLicenseAcceptance>false</requireLicenseAcceptance>
   <description>Shared Contracts and Model for the Application layer</description>
   <projectUrl>https://gitlab.tuiwestern.eu/SalesDistribution/_common-packages/ToolBelt.Application</projectUrl>
 </metadata>
 <files>
   <file src="bin/*/netstandard2.0/ToolBelt.Application.Model.dll" target="lib/netstandard2.0" />
   <file src="bin/*/netstandard2.0/ToolBelt.Application.Model.pdb" target="lib/netstandard2.0" />
   <file src="bin/*/netstandard2.0/ToolBelt.Application.Contracts.dll" target="lib/netstandard2.0" />
   <file src="bin/*/netstandard2.0/ToolBelt.Application.Contracts.pdb" target="lib/netstandard2.0" />
 </files>
</package>
  • 該項目必須.gitlab-ci.yml包含建構、執行生成 nuget 並將其推送到 nuget 儲存庫的所有步驟(以我在 Artifactory 為例)。例子:
#Stages
stages:
 - ci
 - codequality
 - build
 - publish

#Global variables
variables:
 GIT_STRATEGY: $STRATEGY
 BUILD_NUMBER: $CI_PIPELINE_ID

#Jobs
ci:
 image: ocp-golden-images.artifactory.mycompany.eu/gitlab-runner-nuget-dotnet-core:latest
 stage: ci
 script:
   - export VERSION=$(echo $(date +"%Y.%-m%d").$CI_PIPELINE_ID)
   - export NUGET_PACKAGE_FOLDER=nupkgs
   - dotnet build --configuration Release
   - dotnet vstest ./*Tests/bin/Release/**/*Tests.dll
   - mkdir $NUGET_PACKAGE_FOLDER
   - nuget pack ./*NuGet/*.nuspec -Version $VERSION -OutputDirectory $NUGET_PACKAGE_FOLDER -Prop Configuration=Release -NoDefaultExcludes -Verbosity detailed
   - cd $NUGET_PACKAGE_FOLDER
   - dotnet nuget push *.$VERSION.nupkg -s https://artifactory.mycompany.eu/artifactory/api/nuget/MyRepo

因此,這些是建構具有以下結構的項目所需的所有命令:

myApp
-ToolBelt.Application.Nuget
--ToolBelt.Application.Nuget.nuspec
-ToolBelt.Application.Contracts
-ToolBelt.Application.Model
-ToolBelt.Application.Model.UnitTests

其中包含 nuspec 的項目(例如:)ToolBelt.Application.Nuget必須對需要包含在包中的每個項目具有依賴關係(例如:ToolBelt.Application.ContractsToolBelt.Application.Model

引用自:https://stackoverflow.com/questions/52271134