Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

发布自己的npm包 #19

Open
liujie2019 opened this issue Mar 10, 2019 · 0 comments
Open

发布自己的npm包 #19

liujie2019 opened this issue Mar 10, 2019 · 0 comments

Comments

@liujie2019
Copy link
Owner

[TOC]
npm是javascript的包管理工具,是前端模块化下的一个标志性产物。简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率。

1. 创建一个模块

Node.js模块就是发布到npm的代码包。

创建一个新模块的第一步就是创建一个package.json文件。 我们可以使用npm init -y来快速创建一个package.json文件。这个过程中命令行会逐步提示你输入这个模块的信息,其中模块名字和版本号是必填项。

{
  "name": "npm_lj_test",
  "version": "1.0.2",
  "description": "npm package test",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "lj",
  "license": "ISC"
}

2. 新建入口文件

入口文件默认是index.js。这里给出一个最简单的例子,在默认的index.js文件里写一个要导出的函数,这个函数也就是别人的代码里可以import或者require的。

exports.sayHello = function () {
    console.log("This is my first npm module");
};

至此,我们的第一个node模块就已经创建完成了,下一步就是发布到npm服务器了。

3. 将新建模块发布到npm服务器

3.1 注册npm账号

目前有两种方式:

  1. npm官网注册
  2. npm adduser (按照提示创建)
3.2 登录并输入相关信息

首次需要登录,npm login 存储证书到本地,之后就不需要每次都登录了。登录过程中需要输入用户名,密码,还有邮箱,这些都是刚刚注册时候填写的。

3.3 NPM 包文件设置

NPM 打包发布的时候,会默认把当前目录下所有文件打包。但是 Git 仓库中,有些东西是不需要 发布到 NPM 的,因此我们需要使用一个文件 .npmignore 来忽略这些文件,常用配置如下:

/.git/
/.vscode/
/docs/
/node_modules/
.gitignore
.npmignore
tslint.json
tsconfig.json
*.log

这些文件都不是发布需要的内容,因此可以忽略。

3.4 模块发布
// 发布包
npm publish 

发布过程会把整个目录发布,不想发布的内容模块,可以通过 .gitignore.npmignore 文件忽略不想发布的内容。

发布成功后可以到npm个人中心的packages页面查看

3.5 更新npm包

对包中的相关文件进行修改完毕后,在发布修改的模块之前,必须先创建新版本的version,执行一下命令:

npm version [patch/minor/major]
#运行命令后,package.json中的version将被修改

#然后在之下发布命令
npm publish

4. npm包维护

语义化的版本:

  1. patch(补丁): bug的修复和小的修改;
  2. minor(次要更新): 增添了新的特性,但不破坏之前的特性;
  3. major(主要更新): 项目大的调整,修改了之前的特性;
  4. prerelease: 预览版。
4.1. 版本号维护

维护一个包,肯定是要进行包的版本升级的。如何进行呢?手动修改 package.json 的 version 字段是一个办法,但是显得有点 low。可以使用下面的命令:

# 主版本号.子版本号.修订版本号 => 0.1.0
# 版本号变成 0.1.0,即显式设置版本号
npm version v0.1.0
   
# 版本号从 0.1.0 变成 0.1.1,即修订版本号加一 
npm version patch

# 版本号从 0.1.1 变成 0.2.0,即子版本号加一       
npm version minor 

# 版本号从 0.2.0 变成 1.0.0,即主版本号加一      
npm version major       

除了上述命令之外,还有四个命令用于创建预发布版本(非稳定版本),具体命令如下:

#显式设置版本为1.2.3
npm version v1.2.3

# 版本号从 1.2.3 变成 1.2.4-0,就是 1.2.4 版本的第一个预发布版本
npm version prepatch

# 版本号从 1.2.4-0 变成 1.3.0-0,就是 1.3.0 版本的第一个预发布版本
npm version preminor

# 版本号从 1.2.3 变成 2.0.0-0,就是 2.0.0 版本的第一个预发布版本
npm version premajor

# 版本号从 2.0.0-0 变成 2.0.0-1,就是使预发布版本号加一
npm version prerelease

特别注意: version 命令默认会给你的 git 仓库自动 commit 一把,并打一个 tag。如果不想它动你的 git 仓库,你应该使用 --no-git-tag-version 参数,例如:

npm --no-git-tag-version version patch

如果想一劳永逸,那么可以使用如下 NPM 设置彻底禁止它:

npm config set git-tag-version false  # 不要自动打 tag
npm config set commit-hooks false     # 不要自动 commit
4.2. 使用标签

以 TypeScript 为例,通过 npm info typescript 可以看到 dist-tags 字段有着五个 值,分别是 latest, beta, rc, next, insiders,这些都是 dist-tag,可以 称之为标签——你可以把它理解为 git 里面的分支。

有什么用呢?其实,我们平时用 npm install xxx 的时候,是使用了一个潜在的选项 tag = latest,可以通过 npm config list -l | grep tag 看到。

因此实际上是执行了 npm install xxx@latest。也就是安装了 latest 这个标签对应的最新版本。

不同的标签可以有不同的版本,这就方便我们发表非稳定版本到 npm 上,与稳定版本分开。默认是发布到 latest 标签下的。

例如 npm publish --tag dev 就可以发布一个版本到 dev 标签下。

4.3. 使用前缀

如果你使用过 AngularJS 或者 TypeScript,那么肯定知道有一些包的名字是这样的:

@types/node
@types/jquery
@angular/core

@types/ 和 @angular/ 叫做包前缀(scope)。

作者起初以为使用包前缀也是收费的,后来仔细阅读了文档才发现公开的包可以免费使用包前缀。

那我们怎么使用呢?很简单,首先在 package.json 里面把 name 字段加上一个前缀。

前缀必须是你 NPM 账户的用户名,比如你注册了一个用户名为 abc 的账户,则你只能使用 @abc/ 为你的包前缀。
举个例子,将你的包名设置为 @abc/test

如果你要初始化一个带包前缀的包,则可以使用下面的命令:

npm init --scope=abc #可以加上个 `-y` 快速创建。

或者你想每次都使用 @abc/ 包前缀,加个设置即可:

#这样每次初始化新的 package.json,都将自动应用 @abc/ 包前缀。
npm config set scope abc

现在,可以发布你的包到 npmjs.org 了。哦不,别忘了一点:

官方文档表示:所有带前缀的包,在发布的时候,默认都是发布为私有包。

这意味着你不能就这么发布,因为你(可能)不是付费用户,不能发布私有的包。那怎么办呢?别担心,npm publish 命令还有一个参数 --access ,通过这个参数可以指定发布的是公共包还是私有包。因此,只要用下面的命令就可以发布一个公共的带包前缀的包了:

npm publish --access=public

5. demo

#发布第一个稳定版本
npm publish  //1.0.0

#进行相应修改,发布第二个稳定版本
npm version patch
npm publish  //1.0.1

#继续修改文件发布一个prerelease版本
npm version prerelease
npm publish --tag beta //1.0.2-0

#继续修改文件发布一个prerelease版本
npm version prerelease
npm publish --tag beta //1.0.2-1

使用npm info命令查看相关信息:

#主要关注以下信息
'dist-tags': { latest: '1.0.1', beta: '1.0.2-1' },
versions: [ '1.0.0', '1.0.1', '1.0.2-0', '1.0.2-1' ]

dist-tags字段中存储了当前模块的最新的稳定版本和最新的beta版本,versions数组中存储的是当前模块的所有版本列表。

5.1 npm dist-tag命令
#获取到所有的最新的版本,包括prerelease与稳定版本
npm dist-tag ls

#结果如下:
beta: 1.0.2-1
latest: 1.0.1
#<pkg>代表当前npm包名
#<version>是版本号
#<tag>可以为latest, beta, rc, next, insiders
npm dist-tag add <pkg>@<version> [<tag>]
npm dist-tag rm <pkg> <tag>
npm dist-tag ls [<pkg>]
5.2 设置prerelease版本为稳定版本

当模块的prerelease版本已经稳定了,可以将其设置为稳定版本,具体命令如下:

npm dist-tag add npm_test_lj@1.0.2-1 latest

通过npm info查看结果如下:

#latest: '1.0.2-1' => 已经改变
name: 'npm_test_lj',
'dist-tags': { latest: '1.0.2-1', beta: '1.0.2-1' },
versions: [ '1.0.0', '1.0.1', '1.0.2-0', '1.0.2-1' ]

参考文档

  1. npm开始
  2. 手把手教你创建你的第一个 NPM 包
  3. npm
  4. 使用 NPM 发布与维护 TypeScript 模块
  5. 深入 Node 模块的安装和发布
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant