【问题标题】:Is it possible to automate .Net assembly versioning using semantic-release?是否可以使用语义发布自动化 .Net 程序集版本控制?
【发布时间】:2022-01-25 12:42:35
【问题描述】:

我有一个 C# 解决方案,其中包含一个使用 .Net 6 的项目和多个库。我正在使用常规提交(使用 husky 提交)并希望使用 semantic-release 来部署最新版本根据提交消息作为 Github 上的 ZIP 文件。


我为 C# 项目尝试的设置:

  • 安装包

.

npm install semantic-release -D
npm install @semantic-release/changelog -D
npm install @semantic-release/npm -D
npm install @semantic-release/github -D
npm install @semantic-release/git -D
  • 在根目录下创建.releaserc.json文件

.

{
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    "@semantic-release/npm",
    [
      "@semantic-release/github",
      {
        "assets": [
          {
            "path": "my-project.zip",
            "label": "my-project-${nextRelease.gitTag}.zip",
            "name": "my-project-${nextRelease.gitTag}.zip"
          }
        ]
      }
    ],
    "@semantic-release/git"
  ]
}
  • package.json 文件中将密钥 version 设置为 0.0.0-development,将密钥 private 设置为 true 并添加存储库 url
  • workflows 目录中创建一个 release-on-push-on-main-branch.yml 文件

.

name: Release on push on main branch
 
on:
  push:
    branches:
      - main
 
jobs:
  release-on-push-on-main-branch:
    runs-on: ubuntu-latest
 
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: 16.x

      - name: Install Node dependencies
        run: npm install
 
      - name: Setup .Net
        uses: actions/setup-dotnet@v1
        with:
          dotnet-version: '6.0.x'
 
      - name: Install .Net dependencies
        run: dotnet restore ./SolutionDir
 
      - name: Run build
        run: dotnet build ./SolutionDir
 
      - name: Run publish
        run: dotnet publish ./SolutionDir
 
      - name: Rename publish directory of MyProject to my-project and move it to root
        run: mv ./SolutionDir/MyProject/bin/Debug/net6.0 ./my-project
 
      - name: ZIP my-project directory
        run: zip -r my-project.zip my-project
 
      - name: Release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: npx semantic-release --branches main

它似乎有效,每当我推送到主分支时,它都会将具有最新版本的发行版(包含 DLL)部署到 Github 版本。


但正如您所知,semantic-release 不会发布正确的包版本,因为它还不知道程序集版本。它从 package.json 文件中获取版本。

我想要达到的目标:

  • 在解决方案内对库或应用程序进行更改时,它应根据常规提交自动增加其程序集版本。但显然,如果该项目被修改了。
  • 在运行发布过程时,semantic-release 应该使用"name": "my-project-${assembly-version}.zip" 发布项目

有什么我可以用的吗?

【问题讨论】:

  • @DanielA.White 但我必须手动完成。 Commitlint 应该知道要发布什么版本
  • 使用 GitVersion。
  • @fredrik 所以 GitVersion 知道下一个版本,但语义发布也知道它对吗?你介意展示一个样本吗?

标签: c# .net github-actions semantic-release assemblyversions


【解决方案1】:

您可以在dotnet publish 之前空运行semantic-release 以获取发行版的版本号(使用@semantic-release/exec 插件)。然后将此获取的版本号传递给dotnet publish

@semantic-release/exec 插件添加到您的npm install 命令并调整您的.releaserc.json 文件以存储下一个发布版本(例如在环境变量中):

{
   "plugins": [
     ...,
     [
       '@semantic-release/exec',
       { verifyReleaseCmd: 'echo RELEASE_VERSION=\${nextRelease.version} >> $GITHUB_ENV' }
     ]
   ]
 }

dotnet publish 之前插入试运行并调整dotnet publish 步骤:

...
- name: Fetch release version
  env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: npx semantic-release --branches main --dry-run
- name: Run publish
  run: dotnet publish ./SolutionDir -p:Version=${{ env.RELEASE_VERSION }}
...

注意:您可以简单地使用dotnet publish 命令的-o 参数来代替您的Rename publish directory of MyProject to my-project and move it to root 步骤。

【讨论】:

猜你喜欢
  • 2016-04-14
  • 2011-10-27
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多