【问题标题】:Push multiple nupkg files to Github Packages using powershell?使用 powershell 将多个 nupkg 文件推送到 Github 包?
【发布时间】:2020-12-30 13:08:51
【问题描述】:

我们正在 Github 上进行整合,我正在研究如何使用 Github Actions 构建我们的 C# 项目之一,并将生成的 nuget 包推送到 Github 包。我的测试项目生成了大约 15 个包。

似乎“dotnet nuget push”命令一次只支持推送一个文件,所以我正在尝试编写一个与此 shell 命令大致相同的 powershell 脚本

find . -name '*.nupkg' -exec '/usr/bin/echo' 'dotnet nuget push "{}" --source github' ';' | sh -v -

换句话说,为找到的每个 nupkg 文件生成一个“dotnet nuget push "..." --source github" 命令。

到目前为止,我已经找到了 powershell 命令Get-Childitem -Path . -Recurse -Include *.nupkg,它可以获取尽可能多的文件,但是我需要“在 this 文件上执行命令”位。我还希望在执行之前也回显执行的命令,类似于“-v”标志的作用。

另外,如果有更简单的方法可以做到这一点(其他人之前一定遇到过这个问题并且更优雅地解决了它)我会考虑改为。

谢谢。

如何

【问题讨论】:

    标签: c# powershell github-actions github-package-registry


    【解决方案1】:

    要推送到 nuget.org,您应该能够使用以下命令:

    dotnet nuget push "**/*.nupkg" --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.PUBLISH_TO_NUGET_ORG }} --skip-duplicate
    

    要推送到您的 github.com 提要,您应该能够使用以下命令,您应该会发现该命令始终有效(也适用于更大的 nuget 包,例如多目标包):

    nuget.exe push "**/*.nupkg" -NoSymbols -SkipDuplicate
    

    如果您使用的是 GitHub Actions,

    name: .NET Core
    
    on:
      push:
        branches: [ master ]
      pull_request:
        branches: [ master ]
    
    jobs:
      build:
    
        runs-on: windows-latest
    
        steps:
        - name: Checkout
          uses: actions/checkout@v2
        
        - name: Setup .NET Core
          uses: actions/setup-dotnet@v1.7.2
          with:
            dotnet-version: 3.1.301
            # Authenticates packages to push to GPR
            source-url: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
          env:
            NUGET_AUTH_TOKEN: '%NUGET_AUTH_TOKEN%'
        
        - name: Setup MSBuild
          uses: microsoft/setup-msbuild@v1.0.2
        
        - name: Install dependencies
          run: msbuild /t:Restore
          env:
            NUGET_AUTH_TOKEN: ${{ github.token }}
        
        - name: Build
          run: |
            msbuild /t:Pack /p:Configuration=Debug Library/MintPlayer.MVVM/MintPlayer.MVVM.csproj
            dotnet pack Library\MintPlayer.MVVM.BaseModel\MintPlayer.MVVM.BaseModel.csproj --configuration=Release
        
        - name: PushNuget
          run: dotnet nuget push "**/*.nupkg" --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.PUBLISH_TO_NUGET_ORG }} --skip-duplicate
        
        - name: PushGithub
          run: nuget.exe push "**/*.nupkg" -NoSymbols -SkipDuplicate
          env:
            NUGET_AUTH_TOKEN: ${{ github.token }}
    

    目前 github.com 没有符号服务器,因此使用 -NoSymbols 标志。

    【讨论】:

    • 谢谢。我正在查看 Github 包,而不是 nuget.org。 SkipDuplicate 很有趣——我现在想拥有 Maven 所称的 SNAPSHOT,换句话说,非永久包 可以 被从未版本覆盖。你知道我应该如何处理吗?
    • 哦,我现在正在查看的这个项目会生成大约 10 个 nupkg 文件。您能否确认“dotnet nuget push */.nupkg”命令适用于您的多个文件?
    • 哦,看来我确实试过了,我可以说它有效。但是,旧版本的 setup-dotnetsetup-msbuild 已被弃用。发布了我的操作的新版本
    • 遗憾的是,我对 MVN 包没有任何经验。 Java 不是我的 Cup。也许其他人可以详细说明这一点?
    【解决方案2】:

    这里的惯用解决方案是将生成的文件信息对象通过管道传输到ForEach-Object

    Get-ChildItem -Path . -Recurse -Filter *.nupkg |ForEach-Object {
      Write-Host "About to push a package named '$($_.Name)'..." 
      dotnet nuget push $_.FullName --source github
    }
    

    ForEach-Object 块内,$_ 指的是当前正在处理/迭代的单个项目。

    请注意,大多数 PowerShell cmdlet 返回复杂对象(与基于字符串的输出相反) - 因此 $_.FullName 表达式 - FullName 属性包含相关文件的根路径(即C:\path\to\package.nupkg)

    【讨论】:

    • 谢谢。此语法是否支持打印多行?我想在实际执行命令之前打印出找到的文件名(如果可能,用星号括起来)。
    • @ThorbjørnRavnAndersen 当然,您可以在脚本块中添加您喜欢的任何语句,更新示例
    • 您实际上可以在一个命令中推送文件夹中存在的所有 nuget 包:dotnet nuget push "**/*.nupkg"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多