package.json的版本号更新优化方法

目录
  • 引言
  • node.js 部分,我们得有一个更改仓库代码的脚步留给ci执行
  • CI :如何让发布包的行为直接和代码仓库中的版本号同步?
  • 你可能遇到最多的坑
  • 可以优化的地方
  • 可以再优化的地方

引言

本文的起因是有在代码仓库发包后,同事问我“为什么package.json 里的版本还是原来的,有没有更新?”,这个时候我意识到,我们完全没有必要在每次发布的时候还特意去关注这个仓库的版本号,只要在发布打tag的时候同步一下即可,于是有了本文的实践。

node.js 部分,我们得有一个更改仓库代码的脚步留给ci执行

我们首先需要在工程目录中的 ./script/..目录下增加一个 update-version.js脚本

//update-version.js
const path = require('path');
const fs = require('fs');
const newVersion = process.argv[2].replace(/^v/, '');; // 获取命令行参数中的新版本号,并过滤v字头
if (!newVersion) {
    console.log('请传入新版本号,版本号遵循semver规范 .eg: 1.0.0, 1.0.1, 1.1.0');
    process.exit(1);
}
// 获取当前命令行上下文路径
const currentDirectory = process.cwd();
// 获取 package.json 文件中的版本号
const packageJsonPath = path.join(currentDirectory, 'package.json');
const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8');
const packageJson = JSON.parse(packageJsonContent);
const currentVersion = packageJson.version;
// 更新 package.json 文件中的版本号
packageJson.version = newVersion;
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
console.log(`版本号已从 ${currentVersion} 更新为 ${newVersion}`);

接下来在 package.json script 配置后可以直接使用 npm run version <version> 中触发变更版本号脚本。当然这个前提是想要让这个脚本保留给开发者命令行使用。

{
    "name": "version workflow",
    "version": "1.0.0",
    "description": "version update demo",
    "main": "index.js",
    "scripts": {
        //...
        "version": "node ./scripts/update-version.js"
    },
    //...
}

CI :如何让发布包的行为直接和代码仓库中的版本号同步?

接下来算重头戏,如何让发布包的行为直接和代码仓库中的版本号同步?这里我们使用的是github 提供的github action,具体操作和语法可以查看一下官方文档,本文就不过多展开。

我们需要在仓库更目录增加如下路径的文件 .github/workflows/update-action.yml

name: Update Package Version
on:
  release:
    types: [released]
jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
     - name: Update package.json
       run: |
         node ./scripts/update-version.js ${{ github.event.release.tag_name }}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
     - name: Commit changes
       run: |
         git config user.name "Your github name"
         git config user.email "your github email"
         git add .
         git commit -m "Update version to ${{ github.event.release.tag_name }} for release ${{ github.ref }}"
     - name: Push changes
       uses: ad-m/github-push-action@master
       with:
         github_token: ${{ secrets.GITHUB_TOKEN }}

我们在 release hook 中的 released 状态下增加了一个 update job。 它会做下面几件事情(在脚本步骤中有)

  • 【Checkout code】 切出新的代码分支;
  • 【 Update package.json】在新分支执行 update-version.js 传入tag_name更新我们的工程版本号;
  • 【Commit changes】以你定制的 git config user 信息创建一个新提交;
  • 【Push changes】推送变更回到主干;

ps:正确来说应该在发布执行动作前prereleased执行我们的 job 但是没用这个的原因如下:

Note:  The prereleased type will not trigger for pre-releases published from draft releases, but the published type will trigger. If you want a workflow to run when stable and pre-releases publish, subscribe to published instead of released and prereleased.

当这个脚本推送后,执行发布后自动更新版本,不用在关注这个版本修改问题。 你会得到下面的效果。

在你的仓库发布界面填写正确tag后发布

触发update job 更改完成

你可能遇到最多的坑

  • action 执行失败

Process completed with exit code 129." Node.js 12 actions are deprecated. Please update the following actions to use Node.js 16: actions/checkout@v2. For more information, see https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/.

这是由于默认action job 执行环境的nodejs 版本与actions 包中执行脚本不匹配导致,所以一定要使用 checkout@v3 版本 actions/checkout@v3

  • 各种不熟悉 action 语法取值导致的问题

可以优化的地方

我们前面提交的这个流程发布还是有个问题,你永远有个更超前的 commit hash 在你发布的 tag 之后

所以这个action 还有需要继续优化的地方,那就是同步更新tag hash

name: Update Package Version
on:
  release:
    types: [released]
jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
     - name: Update package.json
       run: |
         node ./scripts/update-version.js ${{ github.event.release.tag_name }}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
     - name: Commit changes
       run: |
         git config user.name "Your github name"
         git config user.email "your github email"
         git add .
         git commit -m "Update version to ${{ github.event.release.tag_name }} for release ${{ github.ref }}"
         git_hash=$(git rev-parse --short HEAD)
     - name: Push changes
       uses: ad-m/github-push-action@master
       with:
         github_token: ${{ secrets.GITHUB_TOKEN }}
    - name: Tag Push changes
      run: |
        git tag -f ${{ github.event.release.tag_name }} $git_hash
        git push --force origin ${{ github.event.release.tag_name }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

这里相比之前的版本增加了 Tag Push changes 这个步骤,在最后获取这个版本更新产生的 $git_hash强制更新到发布的 tag 上。

我们看看效果

最后我们看版本发布管理中的 tag hash

搞定!

可以再优化的地方

现在我们还有个问题,就是在执行 Commit changes 这个步骤时每次 git config user.name "Your github name" git config user.email "your github email" 这里是写死的,我们可以根据 GitHub Actions 中有一些预设的环境变量可以读取到当前用户的账号和邮箱信息。通过 ${{ env.GITHUB_ACTOR }} 获取到当前执行的 Actions 的用户账号,通过 ${{ env.GITHUB_ACTOR }}@users.noreply.github.com 获取到当前执行的 Actions 的用户邮箱(该邮箱为 noreply 邮箱,用于 GitHub 的通知,无法发送邮件)。注意,该邮箱不一定是用户本身的真实邮箱,可能是 GitHub 默认的邮箱。

如果需要获取当前 GitHub 账号的真实邮箱地址,可以通过 GitHub REST API 进行查询,具体可以参考官方文档:

这样我们就需要在Commit Changes之前再加一个Set Git user步骤

- name: Set Git user
  env:
    GITHUB_ACTOR: ${{ github.actor }}
    GITHUB_EMAIL: ${{ github.actor }}@users.noreply.github.com
  run: |
    git config --global user.name "${{ env.GITHUB_ACTOR }}"
    git config --global user.email "${{ env.GITHUB_EMAIL }}"

这样我们最终的 Github action 脚本长这样

name: Update Package Version
on:
  release:
    types: [released]
jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
     - name: Update package.json
       run: |
         node ./scripts/update-version.js ${{ github.event.release.tag_name }}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
     - name: Set Git user
       env:
         GITHUB_ACTOR: ${{ github.actor }}
         GITHUB_EMAIL: ${{ github.actor }}@users.noreply.github.com
       run: |
         git config --global user.name "${{ env.GITHUB_ACTOR }}"
         git config --global user.email "${{ env.GITHUB_EMAIL }}"
     - name: Commit changes
       run: |
         git add .
         git commit -m "Update version to ${{ github.event.release.tag_name }} for release ${{ github.ref }}"
         git_hash=$(git rev-parse --short HEAD)
     - name: Push changes
       uses: ad-m/github-push-action@master
       with:
         github_token: ${{ secrets.GITHUB_TOKEN }}
    - name: Tag Push changes
      run: |
        git tag -f ${{ github.event.release.tag_name }} $git_hash
        git push --force origin ${{ github.event.release.tag_name }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

以上就是package.json的版本号更新优化方法的详细内容,更多关于package.json版本更新优化的资料请关注我们其它相关文章!

(0)

相关推荐

  • npm start运行项目过程package.json字段详解

    目录 正文 项目名称 项目版本号 项目介绍 执行命令 1 包配置安装npm install(npm i) 2 打包项目 npm run build 3 运行项目 npm run dev 存储库 关键词 bugs homepage 正文 在js项目运行时,通常输入npm start,即可运行,其运行过程如下: npm start首先会安装一系列的必要程序,这些程序依赖package.json中的内容, package.json里默认定义了项目名称.项目版本号.项目介绍.项目作者.执行命令.生产环境

  • package.json与package-lock.json的区别及详细解释

    目录 package.json package-lock.json 两者区别: package-lock.json的作用 补充:关于package-lock.json的详细解释 总结 package.json 记录当前项目所依赖模块的版本信息,更新模块时锁定模块的大版本号(版本号的第一位),不能锁定后面的小版本, package-lock.json package-lock.json 是在 `npm install`时候生成一份文件.记录了node_modules目录下所有模块(包)的名称.版本

  • nodejs更新package.json中的dependencies依赖到最新版本的方法

    如果手动去修改dependencies中各个包的版本号,那就太麻烦了,借助npm-check-updates工具可以很方便的将package.json中的依赖包版本号更新为最新版本. 1.安装: npm install -g npm-check-updates 使用: 2.检查package.json中dependencies的最新版本: ncu 3.更新dependencies到新版本: ncu -u 更新全部dependencies到最新版本(包括当前指定版本范围满足最新版本号的,比如^4.

  • Node.js中package.json中库的版本号(~和^)

    ~和^的区别 最近总是碰到一些问题, 在本地好好的, 在线上就出现了问题, 本地也一直复现不了, 后来把node_modules目录删除了之后, 重新安装, 就在本地复现了这个问题,可以看了git history, 并没有人修改package.json中的版本号,于是认真的了解了一下package.json中库的版本号; ~和^的区别 "babel-loader": "^7.1.1", "body-parser": "~1.15.2&q

  • nodejs require js文件入口,在package.json中指定默认入口main方法

    我们都知道nodejs遵循commonJS规范,各个js是独立的. 如果目录结构是: –config 文件夹 – index.js – test.js app.js 那么在app.js中require('./config')的时候,默认是index.js. 如何修改默认的config的入口? 只需要在config中添加package.json配置文件,在这个文件中进行指定默认的入口 { "name":"配置文件", "description":&

  • package.json版本号符号^和~前缀的区别

    开发中经常会使用npm install 安装依赖包,经常会看到^符号和~符号,现将二者的区别总结如下: 版本号 x.y.z : z :表示一些小的bugfix, 更改z的号, y :表示一些大的版本更改,比如一些API的变化 x :表示一些设计的变动及模块的重构之类的,会升级x版本号 在package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^. ~的意思是匹配最近的小版本 比如~1.0.2将会匹配所有的1.0.x版本,但不匹配1.1.0 ^的意思是最

  • 详解Nodejs之npm&package.json

    一直以来,作为前端开发,在公司都是先写好页面,然后再跟后端合作,将数据填入前端页面中,但是偶尔自己闲来无事,也会看一些框架什么的,然后利用框架做个单页面应用啊,app什么的,这时候页面的数据总是一些假数据,而关于数据请求的部分就没办法做(因为没有后台嘛).所以我感觉是时候学习一下node了,这对于我以后要学的webpack,前端工程化等也有一定帮助. 作为前端,因为经常用到gulp,webpack等工具,所以我们最常见到的是npm和package.json,所以先总结一下它们俩. npm 初始化

  • Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

  • webpack-dev-server自动更新页面方法

    这两天在看webpack,今天卡在webpack-dev-server上了,折腾了一下午,一直无法正常运行,每次服务器也提示正常启动了,但是浏览器一输入localhose:8080/admin就提示Get/...,反正就是无法打开页面.最后找到一个帖子,发现原来是我启动服务器的代码有问题. 先安装webpack相关组件 cnpm i webpack-dev-server --save-dev cnpm i webpack --save-dev 代码如下: 1.项目结构如下: 2.webpack.

  • Electron autoUpdater实现Windows安装包自动更新的方法

    前言 Electron帮助我们突破浏览器的界限,通过Electron构建的桌面应用拥有各种浏览器应用梦寐以求的能力. Electron提供的autoUpdater还可以帮助我们实现桌面应用的自动更新. 文件结构 首先,我们已经有了一个基于Electron做的应用,项目中有两个package.json.这样做的一个原因是将devDependencies和dependencies分开了,另外就是不需要在打包的时候再去指定哪些依赖不需要一起打到安装包里面去了(通过ignore参数). 目录结构类似于这

  • vue增加强缓存和版本号的实现方法

    强缓存: 到底什么是强缓存?强在哪?其实强是强制的意思.当浏览器去请求某个文件的时候,服务端就在respone header里面对改文件做了缓存配置.缓存的时间.缓存类型都由服务端控制. 强缓存实现: cache-control: max-age=315360000, public ,immutable 客户端和代理服务器都可以缓存该资源,在315360000秒(10年)的有效期内,如果有请求该资源的需求的话就直接读取缓存,statu code:200 ,即使用户做了刷新操作,也不向服务器发起h

  • package.json各个属性说明详解

    什么是Node.js的模块(Module)? 在Node.js中,模块是一个库或框架,也是一个Node.js项目.Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json --  [长城_changcheng] 一般package.json放置在项目根目录下,其基本结构如下图所示: package.json 结构图 属性介绍 description 字符串.用来描述当前项目的大致功能. name 此项目包的名

随机推荐