docker搭建verdaccio私库,上传本地依赖

87 阅读1分钟

前公司是内网开发,当时搭建了本地依赖库。过年期间给自己电脑搭一个,并做此记录。

一.docker搭建verdaccio

网上教程有很多,参考 zhuanlan.zhihu.com/p/618257146

主要步骤:

1.拉取verdaccio镜像

docker镜像都可以在hub.docker.com 上找到,需要科学上网。

docker pull verdaccio/verdaccio

2.宿主机建立预设文件 并形成映射

  1. 建立文件夹
在本地建立storage,plugins,conf/config.yaml,auth/htpasswd三个文件夹
storage 存放npm包 
plugins 存放插件
conf 预设 config.yaml 文件
auth 预设用户 htpasswd 文件

image.png

config.yaml内容参考如下

storage: ./storage
plugins: ./plugins
web:
  title: Verdaccio
auth:
  htpasswd:
    file: ./htpasswd
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
packages:
  '@*/*':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
  '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy: npmjs
server:
  keepAliveTimeout: 60
middlewares:
  audit:
    enabled: true
publish:
  allow_offline: true
logs:
  - { type: stdout, format: pretty, level: http }

  1. 建立运行容器

docker run -it --name verdaccio -v /D/env/verdaccio:/verdaccio -v /D/env/verdaccio/storage:/verdaccio/storage -v /D/env/verdaccio/plugins:/verdaccio/plugins -p 4873:4873 verdaccio/verdaccio

二.安装nrm,添加镜像源

nrm的使用参考 juejin.cn/post/693159…

1.全局下载nrm
npm i -g nrm
2.添加verdaccio镜像
nrm add verdaccio localhost:4873
3.切换至verdaccio镜像
nrm use verdaccio

三.上传本地依赖

在依赖根目录下执行 npm publish 即可上传

image.png

如果想上传整个node_modules,参考如下脚本。

//将所有依赖上传至verdaccio
const fs = require("fs")
const path = require("path")
const process = require('process');
const exec = require("child_process").execSync
let dirName
start()
function start(){
	 dirName = __dirname;
	const result = fs.readdirSync(dirName)
	result.forEach(fName=>{
		const stat = fs.statSync(fName)
		if(isDir(stat)){
			findPath(fName,__dirname)
		}else{
			upload(fName,dirName)
		}
	})
}
function isDir(stat){
	return stat.isDirectory()
}

function findPath(dirCtion,dirPath){
	const runDir =	path.join(dirPath,dirCtion)
	const inDirName = fs.readdirSync(runDir)
	inDirName.forEach(dir=>{
		const tempPath = path.join(runDir,dir)
		const stat = fs.statSync(tempPath)
		if(isDir(stat)){
			findPath(dir,runDir)
		}else{
			upload(dir,runDir)
		}
	})
}

function upload(file,runPath) {
	if(file == 'package.json'){
		console.log("find Package.json"+runPath);
		process.chdir(runPath)
		try{
			exec("npm publish",(error, stdout, stderr)=>{
				if (error) {
					console.error(`执行出错: ${error}`);
					return;
				  }
				  console.log(`stdout: ${stdout}`);
				  console.error(`stderr: ${stderr}`);
				  console.log(runPath.substring(runPath.lastIndexOf("/")+1,runPath.length)+"已上传完成");
			})
		}catch{

		}
		process.chdir(dirName)

	}
}