docker搭建私有npm仓库

2023-11-18

一、dockerhub搜索verdaccio/verdaccio镜像

  

 二、docker拉取镜像

docker pull verdaccio/verdaccio:latest

 三、查看镜像

docker image ls

 

四、运行容器 


docker run -it -d --name verdaccio -p 4873:4873 verdaccio/verdaccio

 或者

docker run -it -d --name verdaccio -p 4873:4873 -v /home/verdaccio/storage:/verdaccio/storage -v /home/verdaccio/conf:/verdaccio/conf -v /home/verdaccio/plugins:/verdaccio/plugins verdaccio/verdaccio
  1.  运行mkdir /home/verdaccio,创建 /home/verdaccio 目录
  2. cd /home/verdaccio,进入/home/verdaccio 目录
  3. mkdir storage,创建storage目录
  4. mkdir conf,创建conf目录
  5. mkdir plugins,创建plugins目录
  6. -v 宿主机:容器,容器目录映射到宿主机目录

   注意: 宿主机目录 /home/verdaccio/storage 需要设置权限,不然会因为权限问题而导致操作失败。

verdaccio 容器中创建的用户是verdaccio,无法写入主机 root 用户的文件,容器内 verdaccio 使用的 uid 为 10001,gid 为 65533,可以在主机修改权限

chown -R 10001:65533 /home/verdaccio/storage
chown 10001:65533 /home/verdaccio/conf

   宿主机目录映射成功后,会简化很多操作,比如:  
  在 /home/verdaccio 目录下会创建 storage 目录,如果发布了包,则在此目录下的 data 中能找到对应的包文件夹,可以查看所有上传的npm包,此处也可以直接删除该包;  在 /home/verdaccio 目录下会创建conf 目录,配置文件会映射到此目录下,方便我们需要时修改配置信息。

拷贝 verdaccio 配置文件

 如果不想做本地目录映射,也可以使用如下命令,拷贝出 verdaccio 镜像的配置文件。  
  docker cp:在容器和本地文件系统之间,拷贝文件或文件夹。

docker cp verdaccio:/verdaccio/conf/config.yaml /home

 五、私有库部署成功,查看容器

docker ps -a

 六、浏览器访问私有库

 浏览器访问http://ip:4873

七、安装nrm 

nrm是npm的一个镜像源管理工具,可帮助快速切换镜像源,方便管理。在终端(Mac)或者cmd命令窗口(windows)输入命令,全局安装 

npm install nrm -g

 查看版本

nrm -V

 八、nrm使用

查看可供选择的源 

nrm ls

  • 查看当前源:nrm current
  • 切换源:nrm use <registry>
  • 添加源:nrm add <registry> <url> 例如: nrm add aaaaa https://aaaaa.com
  • 删除源:nrm del <registry>
  • 测试源的响应时间:nrm test <registry>

 添加源私有npm源

nrm add myregistry http://133.269.67.168:8773/

九、发布一个包

有了私有库以后,就可以在其上发布 npm 包。但初始化时需要先添加用户,设置用户名和密码等,然后就可以直接发包了。

  • 添加用户

    npm adduser --registry http://0.0.0.0:4873/
    

    输入用户名、密码和邮箱。

  •  

  • publish

    当需要把某个项目发布到私有库时,直接 publish

    npm publish --registry http://0.0.0.0:4873/
    

    发布成功后,刷新页面,就能看到最新发布的包。

  • install

       在项目目录下增加 .npmrc 文件,指定仓库地址。

registry=http://0.0.0.0:4873/

        使用 npm install 包名,即可安装私有包了。

十、vue发布组件库

 1、添加上面刚部署好的私有npm镜像仓库

nrm add myregistry http://133.269.67.128:4873/

 2.查看刚添加的私有npm镜像仓库

nrm ls

3.使用刚添加的私有npm镜像仓库

nrm use myregistry

 4.创建一个vue项目开发组件库

vue create volodyaui

 5.开发组件

在src目录下新建package文件夹,在src/package目录下新建index.js文件,在src/package目录下新建my-button文件夹和my-clock文件夹,在src/package/my-button目录和src/package/my-clock目录下分别新建index.vue

 src/package/index.js

出口文件:引入封装好的组件进行批量注册,然后导出。

// 引入封装好的组件
import MyButton from "../package/my-button/index.vue";
import MyClock from "../package/my-clock/index.vue";
import MyCustomchart from "../package/my-customchart/index.vue";

// 将来如果有其它组件,都可以写到这个数组里
const coms = [MyButton, MyClock, MyCustomchart];

// 批量组件注册
const install = function (Vue) {
    coms.forEach((com) => {
        Vue.component(com.name, com);
    });
};


// 注意这里的判断,很重要
if(typeof windwo !== 'undefined' && window.Vue) {
    window.Vue.use(comment)
  }
  
export default install; // 这个方法以后再使用的时候可以被use调用

为什么导出为install?
安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为install 方法。install 方法调用时,会将 Vue 作为参数传入。 

 src/package/my-button/index.vue

<template>
    <button @click="handleClick" :disabled='disabled'>
        <slot></slot>
    </button>
</template>
<script>
export default {
    name: "MyButton",
    props: {
        disabled: Boolean
    },
    methods: {
        handleClick(evt) {
            this.$emit('click', evt);
        }
    }
};
</script>

 src/package/my-clock/index.vue

<template>
  <div id="clock">
    <div class="box" :style="{ color: textColor }">
      <span class="date">{{ date }}</span>
      <span class="time">{{ time }}</span>
    </div>
  </div>
</template>
<script>
export default {
  name: "MyClock",
  props: {
    textColor: {
      type: String,
      default: "#2cf3fb",
    },
  },
  data() {
    return {
      timer: null,
      date: "",
      time: "",
    };
  },
  created() {
    this.updateTime();
  },
  mounted() {
    this.timer = setInterval(() => {
      this.updateTime();
    }, 1000);
  },
  methods: {
    updateTime() {
      let date = new Date();
      let sDate = "-";
      let sTime = ":";

      let YYYY = formatHandle(date.getFullYear());
      let MM = formatHandle(date.getMonth() + 1);
      let DD = formatHandle(date.getDate());

      let hh = formatHandle(date.getHours());
      let mm = formatHandle(date.getMinutes());
      let ss = formatHandle(date.getSeconds());

      let w = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
      let week = w[date.getDay()];

      this.date = YYYY + sDate + MM + sDate + DD + ` ${week}`;
      this.time = hh + sTime + mm + sTime + ss;

      function formatHandle(value) {
        if (value >= 0 && value < 10) return "0" + value;
        else return value;
      }
    },
  },
  beforeDestroy() {
    clearInterval(this.timer);
  },
};
</script>
<style lang="scss" scoped>
#clock {
  font-family: "Share Tech Mono", monospace;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  .box {
    text-align: center;
    .date {
      font-size: 28px;
      letter-spacing: 2px;
      display: inline-block;
      padding-bottom: 10px;
    }
    .time {
      letter-spacing: 6px;
      font-size: 80px;
    }
  }
}
</style>

6.修改项目的package.json文件

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build --target lib ./src/package/index.js --name volodyaui --dest volodyaui"
  },

 package.json文件

{
  "name": "volodyaui",
  "version": "0.1.0",
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build --target lib ./src/package/index.js --name volodyaui --dest volodyaui"
  },
  "dependencies": {
    "core-js": "^3.8.3",
    "vue": "^2.6.14"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "sass": "^1.32.7",
    "sass-loader": "^12.0.0",
    "vue-template-compiler": "^2.6.14"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

利用了vue-cli的构建方法,构建单独的入口
-- target lib 关键字 指定打包的目录 后面可以接上entry打包入口

-- name 打包后的文件名字
-- dest 打包后的文件夹的名称

7.打包开发好的组件库 

npm run build

 打包成功后会在项目根目录下生成volodyaui文件夹

 8.上传打包好的组件库代码

 终端进入刚打包成功生成的volodyaui文件夹目录下

 在该目录下,初始化package.json文件目录

作为一个组件库,我们必须按照npm的发包规则来编写我们的package.json, 我们先来解决组件库打包的问题,首先我们需要让脚手架编译我们的组件代码,并输出到指定目录下,我们按照发包规范一般会输出到lib目录下,代码如下:

组件库上传npm需要按照npm规则来编写package.json。

npm init -y

 修改刚生成的package.json文件

  "keywords": [
    "MyButton",
    "MyCloc",
    "MyCustomchart"
  ],
  "author": "",
  "license": "MIT",
  "private": false,
  "homepage": "https://github.com/1t1824d/volodyaui", 
  "bugs": {
    "url": "https://github.com/1t1824d/volodyaui"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/1t1824d/volodyaui"
  },
{
  "name": "volodyaui",
  "version": "1.0.0",
  "description": "",
  "main": "volodyaui.common.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "MyButton",
    "MyCloc",
    "MyCustomchart"
  ],
  "author": "",
  "license": "MIT",
  "private": false,
  "homepage": "https://github.com/1t1824d/volodyaui", 
  "bugs": {
    "url": "https://github.com/1t1824d/volodyaui"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/1t1824d/volodyaui"
  },

  "dependencies": {
    "core-js": "^3.8.3",
    "echarts": "^5.3.1",
    "vue": "^2.6.14"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "sass": "^1.32.7",
    "sass-loader": "^12.0.0",
    "vue-template-compiler": "^2.6.14"
  }
}

 

npm login(登录)

npm login

注意:

  1. 输入密码时,默认是不显示的,正常输入就行
  2. npm whoami 可以测试当前是否是登录

测试当前是否是登录 

npm whoam

 npm publish (发布)

npm publish

 注意:
1.私有包@开头的,发布时需要添加 --access public

npm publish --access public

 【特别提醒】:确保本地源服务是 registry.npmjs.org,国内大家都喜欢使用taobao镜像源,但是发布不能发到该服务器上。本人使用 nrm 工具进行镜像源的管理和切换。即需要把组件库发布到哪个npm镜像仓库,就需要把当前使用的源切换到哪个npm源。

9.查看刚发布到私有仓库的组件库

10.安装刚发布成功的UI组件库 

 安装

npm install volodyaui

 引入

import volodyaui from "volodyaui"
import "volodyaui/volodyaui.css";
Vue.use(volodyaui)

使用

  <my-button disabled>222</my-button>
  <my-button>333</my-button>
  <my-clock textColor="red"></my-clock>

浏览器查看

volodyaui:GitHub - 1t1824d/volodyaui

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker搭建私有npm仓库 的相关文章

随机推荐

  • mybatis xml文件中statementType类型

    xml文件示例如下
  • 根目录扩容(SUSE系列,版本1)

    LVM 方式 需求 给根目录和 oradata目录扩容 背景 1 可用闲置盘400G 2 web应用和数据库部在同台机器 3 应用所用目录为根目录 数据库用 oradata目录 4 计划给根100G oradata 300G磁盘大小 步骤
  • 那些好用过头的键盘

    目录 一 好键盘的重要性 二 关于keychron机械键盘 1 轴体部分 1 1 红轴 1 2 青轴 1 3 茶轴 1 4 黑轴 1 5 其他轴 2 性价比 2 1 外观 2 2 连接方式 2 3 轴体 2 4 摔打性 2 5 价格 三 总
  • 稿费一般多少钱一千字_写一篇1000字的稿子多少钱?一般

    目录 1 关于稿子代写 一般稿子分三种类型 第一种 原创稿子 第二种 转发稿子 第三种 书评稿子 这些都是主分类 当前每个主分类肯定会包含很多的子分类 如 翻译稿子 新闻稿子 演讲稿子 会议稿子 等等 当然稿子是有规定的书写格式 并不是随便
  • 使用cs与msf进行内网横向移动

    使用cs与msf进行内网横向移动 目标系统为 192 168 1 123 跳板主机为 192 168 1 118 一 使用cs探测内网 1 将目标上线至CS 2 使用cs探测内网信息 查看当前目标系统网络情况 确认目标系统所在内网网段 3
  • 王者荣耀战力查询的保姆级教程

    王者荣耀段位水平是可以直接看到的 但是荣耀战力才是衡量玩家实力的标准 因为各种排行榜 甚至是职业选手选拔也是看这个荣耀战力的 战力系统可以决定玩家所在区域的排名 并发放牌子 这也是是想展示的一种 那有些玩家所在区域玩家较多 那竞争自然而然地
  • 浅谈自然语言处理(NLP)学习路线(一)--- 概述

    资料汇总 引流 大道至简之机器学习系列 流畅的python https pan baidu com s 1l5Tl0yZS0NTixAilH9S2aQ 提取码 38qa 统计学习方法第二版 https pan baidu com s 18p
  • 一个不错的选色网站

    http 0to255 com 转载于 https www cnblogs com sofire archive 2010 10 12 1849141 html
  • Kali-加密文档Office破解-hashcat(字典)

    利用office2john py 导出word的hash值 office2john py YD xls gt hash txt 修改hash内容 cat hash txt gedit hash txt 破解 m 哈希值类型 hashcat
  • 狂神Redis学习笔记(已更完)

    Nosql概述 一 缓存的发展历史 1 MySQL单机时代 90年代 当时一个基本的网站访问量一般不会太大 单个数据库完全够用了 那个时候 更多使用静态网页html 服务器根本没有太大的压力 这种情况下 整个网站的瓶颈是什么 数据量如果太大
  • [SDOI2008]洞穴勘测【LCT维护联通关系】

    题目链接 LCT判断两点联通的这样的一个基础问题 因为不存在环 所以直接LCT维护连接关系即可 include
  • MySQL-DML语句

    DML语句 Create 单行插入数据 多行插入数据 插入否则更新 replace into 查看受影响行数的函数 Retrieve 全列查询 指定列查询 select 函数 表达式 对查询出的列重命名 as distinct order
  • 21 单例模式

    1 定义 单例模式 保证一个类仅有一个实例 并提供一个访问它的全局访问点 单例模式的使用场景 只要一个实例 例如一个Web页面上的计数器 可以不用把每次刷新都记录到数据中 使用单例模式保持计数器的值 并确保是线程安全的 创建一个对象需要消耗
  • 设计模式概述

    设计模式的重要性 以实际工作举例 给用户开 开发完成后客户增加新的功能 例如原本程序适配两个产品 增加第三个产品 程序可扩展性 程序开发完成后的后续维护 规范性 可读性 总结 高内聚 低耦合 可维护性 可扩展性 类与类之间的关系 依赖 类A
  • 基于Qt的Sapera LT开发

    基于Qt的Sapera LT开发 基于Qt来开发Sapera LT 需要经过以下几个步骤 1 在建立的Qt工程添加Sapera LT的相关路径 1 右键工程 Properties 2 Configuration Properties C C
  • echarts x轴的日期显示为年月日

    xAxis type time min new Date 开始时间 max new Date 结束时间 axisLabel interale 0 rotate 40 设置日期显示样式 倾斜度 formatter function value
  • linux下查看U盘文件

    1 查看U盘是哪个设备 shell gt sudo fdisk l 2 挂载到一个目录下 新建一个目录 shell gt cd mnt shell gt sudo mkdir usb 将u盘挂载到该目录下 shell gt sudo mou
  • vs2017 15.5.x dll调试不成功问题

    配置 Unity5 5 5f1 vs2017 问题 更新到vs2017 15 5 0之后 项目中用到的dll调试断点进不去了 之后更新到15 5 1 依然进不去 现象 Unity工程下生成的dll文件只有dll pdb没有dll mdb文件
  • SEO利器:使用Python爬虫实现竞争对手关键词分析

    在当今的数字时代 搜索引擎优化 SEO 是许多网站主和营销人员追求的目标 为了提高自己网站在搜索结果中的排名 并吸引更多有针对性的流量 我们需要深入了解竞争对手以及他们所使用的关键词策略 本篇文章将向您介绍一种强大而有效的工具 Python
  • docker搭建私有npm仓库

    一 dockerhub搜索verdaccio verdaccio镜像 二 docker拉取镜像 docker pull verdaccio verdaccio latest 三 查看镜像 docker image ls 四 运行容器 doc