自己写npm插件发布&&进阶Github持续集成工作流自动发布

前言:基于vue来开发一个简单的界面ui插件。

手动发布npm包

一、首先上去npm注册一个账号(这不用说了,略过)

网址:https://www.npmjs.com/
记住账号、密码、邮箱,后面发布需要用到。

二、初始化一个vue项目

vue create package-name
创建一个packages文件夹(重要),里面放的就是你的插件组件(可以这样说),最终目录结构我的是这样,可以参考,根据自己的实际情而定。

插件目录

插件目录分析

  • docs:文档说明
  • packages:插件组件
  • src:下面有assets(资源文件)、components(页面组件)、app.vue(页面入口)、main.js(入口文件)、index.js(重点:插件主入口文件)

其实这个 src 目录你可以作为一个测试的作用,因为你要写的是插件,全部都是在 packages 文件里面。

三、添加插件组件

我们在 packages 下面新建一个 kdd-link 文件夹,文件大概就是这样

插件组件目录

index.js(重点)

// 导入组件,组件必须申明name
import KddLink from './src/kdd-link';

// 为组件提供install方法,供按需引入
KddLink.install = function (Vue) {
    Vue.component(KddLink.name, KddLink)
}

// 导出组件
export default KddLink

kdd-link.vue

<template>
    <a :href="href" v-bind="$attrs">
        <slot></slot>
    </a>
</template>
<script>
export default {
    name: "KddLink",  // 名字一定要写
    props:{
        href: {
            type: String,
            default: ''
        }
        name:{
            type: String,
            default: ''
        }
    },
}
</script>

这样算是写完一个组件了。

写一下index.js文件

import KddLink from '../packages/kdd-link/index.js';
const components = [
    KddLink
]

const install = function (Vue) {
    if (install.installed) {
        return
    }
    install.installed = true;
    components.map(component=>{
        Vue.component(component.name,component)
    })
}

if(typeof window !== 'undefined' && window.Vue) {
    install(window.Vue)
}
export default {
    install,
    KddLink
}

我们来测试一下可不可以使用。

  • 首先在main.js里面引入
main.js引入
  • 在app.vue 里面使用
app.vue使用
  • 效果


    效果

ok,到这里为止就算是写好这个插件了

package.json文件

发包肯定少不了配置package.json,这里我说几个主要的

image.png

.gitignore文件

提交上github上需要忽略的文件,有些文件就不要提交上去了,比如 node_modules 下面的依赖包

.DS_Store
node_modules
/dist
/lib/

# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.eslintrc.js

.npmignore文件

发布的时候需要忽略的文件。

node_modules/
vue.config.js
babel.config.js
*.map
*.html
src/
docs/
.idea
.vscode
.eslintrc.js
.github/
test/  
.github/  
test.js

我这边发布的时候就发了这几个文件,仅供参考,视情况而定,比如你这个包又需要兼容ts,那可能又有其他的文件。


image.png

这样我们的插件算是写完了

四、发布(在目录下)

  • 发布之前需要npm run lib,会自动生成lib文件夹。
  • npm login:登录需要username、password、email,其中password输入时看不见的,只要保证你输入的时正确的,回车就可以继续了。
  • npm publish:发布
    这样,就算是完成这个插件的发布了

你以为就会这样完了吗,就这?不!在登录的过程中你可能会遇到各种各样的问题,比如:

lALPDhJzxZw6wJ7M0s0DvA_956_210.png

怎么解决?有问题,肯定就有解决方案
解决办法:

  1. 先清除掉以前的代理设置
npm config set proxy null
npm config set https-proxy null
  1. 重新设置
npm config registry http://registry.cnpmjs.org/

这个问题呢,我自己也是网上搜刮来的答案,参考链接npm err安装报错解决办法,其实也有其他的解决方法,看哪个有用就完了。
总之,遇到问题,百度或者其他问同事问网友,总能解决的。
最后,我们的插件终于发布成功了,我们来看一下,在其他项目安装这个插件看看能不能使用。

npm install 包名

引入插件

import ui from '包名'

补充
如果在引入的过程中出现一个说你没有安装这个插件的问题,但你明明已经安装了,不要着急,应该就是你在插件的package.json文件没有写对 main 的路径。
这个就是main的作用:插件的主入口

使用

import ui from '包名'
Vue.use(ui);
<kdd-link href="https://www.baidu.com" target="_blank">这是啥链接</kdd-link>
image.png

大功告成!!!

Github持续集成自动化发布npm包

实际应用中,我们发布插件不可能每次都 npm run build 然后 npm login npm publish,这属实有点麻烦,能不能简单一点,我提交个代码或者合并代码的时候就发布呢?那就是持续集成,自动化发布了。

什么是持续集成
持续集成指的是,频繁地(一天多次)将代码集成到主干。
它的好处主要有两个。

  1. 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
  2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

一、首先就是你的代码要放在GitHub上(这不是废话?)

image.png

二、找到Actions创建workflow模板

我这是基于vue的插件,所以选择Node.js Package 点击Set up this workflow

创建workflow模板

三、点击 Commit new file 提交文件

image.png

项目中即可生成下列文件
.github
 |- workflows
   |- npmpublish.yml

npm-publish.yml

# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages

name: Node.js Package

on:
  release:
    types: [created]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
      - run: npm ci
      - run: npm test

  publish-npm:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
          registry-url: https://registry.npmjs.org/
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.npm_token}}

  publish-gpr:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
          registry-url: https://npm.pkg.github.com/
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}

四、代码拉取下来修改一下

# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages

name: Node.js Package

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
      - run: npm ci
      - run: npm test

  publish-npm:
    needs: patch
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
          registry-url: https://registry.npmjs.org/
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.npm_token}}

其实就是删了publish-gpr,gpr(Github Package Registry)修改on触发条件。
下面来解释一下各个部分的含义

  • name 此工作流的名称。
  • on 触发条件,上述文本表示当master分支合并和推送时会触发workflow。
  • jobs 工作集合,例如jobs内部的build、publish-npm表示具体的工作任务的ID,可以自定义。
  • needs 表示当前的job依赖与另外一个job,例如上面的publish-npm依赖于build。
  • runs-on 表示工作所在的虚拟机操作系统,目前可选的系统有ubuntu-latest、ubuntu-18.04、ubuntu-16.04、windows-latest、windows-2019、windows-2016、macOS-latest、macOS-10.14。
  • steps 表示job所执行的 actionscommands 集合。

五、添加npm access Tokens

  • 去到官网,的点击自己的账号头像,找到 access Tokens
image.png
  • 新增一个token,Generate New Token
image.png
  • 选择token类型,我选的是Automation,翻译过来就是,就是发布插件,自动令牌将绕过双因素身份验证。如果启用了双因素身份验证,则在使用自动化令牌时不会提示您,使其适合CI/CD工作流。点击Generate Token
image.png
  • 就创建成功了,一定要复制保存下来,不然关闭窗口就没了
image.png

六、github创建一个secrets

setting页面


image.png

Name 就填写npm_token,因为你的npm-publish.yml文件写的就是${{secrets.npm_token}},把刚刚复制的token粘贴过来。

image.png

七、本地代码推送,在Actions页面就可以看到持续集成的结果了。

image.png
image.png

如果后面再更新发布版本,只要更换npm_token的值就行啦。


image.png
image.png

可能在过程中会遇到一个问题,就是你的包在npm上已经有了这个版本

image.png

package.json修改版本重新推送一下就可以。

image.png

到这里就算是全部工作完成了,以后继续努力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容