前公司是内网开发,当时搭建了本地依赖库。过年期间给自己电脑搭一个,并做此记录。
一.docker搭建verdaccio
网上教程有很多,参考 zhuanlan.zhihu.com/p/618257146
主要步骤:
1.拉取verdaccio镜像
docker镜像都可以在hub.docker.com 上找到,需要科学上网。
docker pull verdaccio/verdaccio
2.宿主机建立预设文件 并形成映射
- 建立文件夹
在本地建立storage,plugins,conf/config.yaml,auth/htpasswd三个文件夹
storage 存放npm包
plugins 存放插件
conf 预设 config.yaml 文件
auth 预设用户 htpasswd 文件
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 }
- 建立运行容器
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 即可上传
如果想上传整个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)
}
}