likes
comments
collection
share

从NPM发包到RELEASE控制版本

作者站长头像
站长
· 阅读数 65

我们平时在工作中,经常会遇到重复组件或函数的情况。一般情况下,可以通过封装组件或函数集合的方式,再以CV来使用。但如果涉及到多个项目使用,就可能会产生同时修改多个文件的需求。这个时候,我们就可以通过新建一个npm包,并上传到npm官网或者其他网站(github)的方式,来实现版本控制和灵活使用。

1、什么是npm包

npm(“Node 包管理器”)是 Node.js 的默认程序包管理器。npm包就是符合这个管理器规范的一个程序包,主要通过package.json去控制一些版本信息。

2、如何制作一个npm包

首先,我们得新建一个node项目。

第一步、npm init ,根据提示,完成一些参数的选择。如图,我们可以先一路回车,选择默认值,之后到项目的package.json里面去修改。

从NPM发包到RELEASE控制版本

我这边新建的项目,会用到vue3和webpack,完成一个简易的vue3的hook方法包,整篇文章的讲解的代码地址如果需要,可以联系我。所以,我这边先贴上部分对应的代码,作为参考。

package.json 文件

{
  "name": “vue3-xxx",  // 项目名称
  "version": “1.3.0", // 版本号
  "description": "some vue3 hooks”, // 描述
  "main": “dist/index.js", // 入口文件
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "cross-env NODE_ENV=production webpack --progress --hide-modules",
  },
  "author": "lxw",
  "license": “MIT", // 凭证
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  "dependencies": {
    "vue": "^3.2.45"
  },
  "devDependencies": {
     "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.0",
    "babel-preset-stage-3": "^6.24.1",
    "cross-env": "^5.0.5",
    "webpack": "^3.6.0"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/xxx/xxx"
  }
}

其中,重要的main属性,项目的入口文件。首先,可以是项目里的src/index.js。但我这边,是需要打包的,那就把入口文件改到dist下的index.js

凭证license要选择MIT,然后,里面的内容都是固定的,只需要修改一下名字就行,代码就不贴了。

Webpack.config.json

var path = require('path')
var webpack = require('webpack')
var externals= process.env.NODE_ENV == "development" ? [] : [
  "vue"
];
module.exports = {
  entry:  "./src/index.js",
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'index.js',
    library: 'npm-up',
    libraryTarget: 'umd',
    umdNamedDefine: true
  },
  //在打包时需要排除的环境包。
  externals: externals,
  module: {
    rules: [
      {
        test: /.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
      },
    ]
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

需要注意的是,entry是程序的本身读取的入口;output,就是指定打包到dist文件夹。

然后,运行npm run build,得到打好的包。

3、发布包

首先得有账号,需要去注册,命令行登录 npm login,如图显示:

从NPM发包到RELEASE控制版本

则登陆成功,如果遇到链接失败的话,就是网络的原因了。

发布 npm publish

可能会因为名称重复等原因失败,删除包npm unpublish <包名> -force,重新提交。

4、包的版本管理

既然我们的项目发布到了node上面,那它的版本维护也就不能忽视了。但根据我查看一些比较知名的库的npm页面来看。

从NPM发包到RELEASE控制版本

npm方面,只能作为简单的记录版本号,其记录的信息比较少,所以是不能满足我们的需求的。既然npm不行 ,那我们就转换下思路,在其关联的git仓库实现我们需要的功能。

那要如何使用呢?

1、Release

Release的定义,是具有changelogs和二进制文件的一级对象,它可以代表超出Git架构本身的一个特定时间点之前的所有项目历史。也就是通过release,不但能够通过源码体现出项目历史,还能通过已经编译好的二进制文件来进一步描述此时的项目状态。

在深入理解release是什么之前,我们需要先知道tag是什么。

tag: 中文名:标签 taggit给我们提供的用于管理记录版本的功能。比如,我每次在提交时,需要将其设定一个版本(2.0.0)

git tag v2.0.0

同时将其记录下来,推送到远程

git push origin --tags 或者 git push origin v1.0.0

在我需要翻看之前的记录(1.0.0,。。)的时候,我就都能查看到。

git show v1.0.0

release: 则是脱离了 git 本身概念的功能,可以说是代码托管平台(github等)提供的更高层的服务。一般在提交时,会要求填写 tag 名、分支以及相应的发布说明,还可上传编译好的程序、打包好的文件等。 就是在上述TAG的功能上,它额外的提供添加编译好的二进制文件以及其他更多信息等。可以让用户在托管平台,以可视化的方式,获取更多的版本信息。比如elementUIrelease功能。 从NPM发包到RELEASE控制版本

2、使用releases-it、changelog管理版本号、上传

releases-it是集成了一套发布流程的工具。它的大致流程包括: 默认模式:

  • 切换版本(例如package.json中)
  • Git提交、标记、推送
  • 使用挂接执行任何(测试或构建)命令
  • 在GitHub或GitLab创建发布
  • 生成更改日志
  • 发布到npm
  • 管理预发布
  • 使用插件扩展
  • 从任何CI/CD环境中发布

先安装releases-it

npm i -D release-it

然后,在package.json中,加入命令

"scripts": {
     "release": "release-it"
   }

之后在根目录下,新建.release-it.json文件,作为配置项。

{
    "github": {
      "release": true
    },
    "git": {
      "commitMessage": "release: v${version}"
    },
    "npm": {
      "publish": true // 是否发不到npm
    },
    "hooks": {
      "after:bump": "echo 更新版本成功"
    },
    "plugins": {
      "@release-it/conventional-changelog": {
        "preset": "见文件",
        "infile": "CHANGELOG.md"
      }
    }
  }

此时,直接运行命令是默认操作。默认情况下,release-it是交互式的,允许您在执行每个任务之前进行确认,但我们通过使用--ci选项,该过程完全自动化,无需提示。将执行配置的任务,如下面第一个动画所示。在持续集成(CI)环境中,此非交互模式将自动激活。

或者使用--only-version可以仅使用提示符来确定版本,并自动执行其余操作。

到这边,简单的配置已经完成了,那我们如何使用呢?

一般情况下,在我们变更了部分代码,需要上传代码,都要先提交再推送到代码服务器。但我们这边,先commit,不要push。

git add .
git commit -m 'feat: release-it'
  • 此处再推荐一个git提交规范工具,帮助我们更清晰的了解每次提交的内容。 安装git-cz,规范commit信息:

    npm install git-cz -D
    

    然后,修改npm scripts 增加 "commit": "git-cz"

    从NPM发包到RELEASE控制版本

如图显示,可以选择几个命令格式。然后就是根据提示,完成下面的步骤。

最后再运行

npm run release 

从NPM发包到RELEASE控制版本

CHANGELOG.md用来记录版本信息的log;package.json中,改变了版本号。

显然这边虽然生成了CHANGELOG.md,但并没有记录下来。于是我们需要借助一个工具,安装一下即可。

npm i @release-it/conventional-changelog -D

从NPM发包到RELEASE控制版本 如何所示,这就是CHANGELOG.md里的内容。

同时,npm包上传成功后,也会有对应版本号显示。

从NPM发包到RELEASE控制版本

4、总结

这篇文章简单讲解了如何在npm上发布一个包,并且使用 rēlease-it 实现版本控制。其实它们还有很多用法和细节没讲到,后续我也会继续学习,希望可以和大家一起进步🦍。(纯粹个人学习记录,都只是些学习总结😂,有不对的地方,还希望达大佬指出,谢谢!)

转载自:https://juejin.cn/post/7182571256145772605
评论
请登录