Open NemoZhong opened 1 year ago
😂刚开始以为直接把项目的package.json和lock文件拿出来install后,放在verdaccio仓库镜像里就好了,dockerfile将本地install的node_modules拷进/verdaccio/storage目录下,结果启起来始终找不到任何包。后面打开package-lock文件才注意到npm仓库实际上存放的是.tgz
的压缩包。比如dayjs
@1.11.9,在lock文件中是存在https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz
下的。所以实际上应该把所有的tgz
包放在容器的/verdaccio/storage
目录下
node-tgz-downloader
npm install node-tgz-downloader -g
download-tgz package-lock package-lock.json
3. 得到的文件夹tarballs,目录结构就是实际上npm仓库存放包的结构
然后直接把文件夹挂载在容器的/storage目录下,使用docker-compose up -d
启动仓库镜像,即可
version: '3'
services:
verdaccio:
image: verdaccio/verdaccio
ports:
- "4873:4873"
volumes:
- ./tarballs:/verdaccio/storage
restart: always
遇到的问题,本地启动服务能正常访问包,但是把文件上传到远程linux服务器上的时候,仓库能正常启动,但是包访问不到,报错500,internal server error
. 通过docker logs可以看到是挂载的文件目录没有权限。
通过chmod 777 tarballs/*
把所有包的权限全部放开后,解决该问题
在远程linux上使用到的命令
## 连接远程服务器
ssh username@ip
## 将本地文件夹(-r)拷贝到远程服务器的根目录'/'下的文件夹下 注意ip不带端口号
scp -r /Users/Workspace/raysaNpm username@ip:/directoryName/
## 将tarballs下的所有文件夹及文件读写执行权限放开(实际上只需要读)
chmod 777 tarballs/*
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
docker保存/载入镜像
docker save `imgID` > `imgName`.tar
docker load < `imgName`.tar
上传文件(夹)到远程服务器(scp会覆盖同名文件,rsync可以增加上传)
scp -r ./myfile.txt user@hostname:/dir
外网维护一个npm本地仓库文件夹,如果要装新包怎么办?
坑哭了,镜像及挂载文件拷到内网之后,启动服务,仓库能正常访问,但是包就是install不了404。
http://ip:4873/@ant-design/colors/-/colors-6.0.0.tgz
可以下载说明文件存在,(下载不了就说明文件夹权限不够,可以scp上传之前在本地通过chmod 755 ./dirname
把文件夹权限改了再上传到远程服务器,或者在远程服务器上登陆的角色权限足够的账号修改挂载文件夹的权限)http://ip:4873/@ant-design/colors
显示无资源,这里应该显示的是该包自身的package.json解决:
a. docker logs
发现获取资源时verdaccio默认的配置还是去uplinks上找了,找不到又去外网下。因此需要把verdaccio的配置文件config.yaml
修改下,这里从容器里通过vim去改始终不能保存,容器内部这个config.yaml是只读的,因此需要把这个配置文件通过挂载的方式在外部去改。这里可以把容器内部的config.yaml拷贝出来docker cp containerID:/verdaccio/conf/config.yaml ./dirName
,或者去https://github.com/verdaccio/verdaccio/blob/5.x/conf/docker.yaml
下载默认配置
cannot open config file /verdaccio/conf/config.yaml: false
,实际上就是语法错误,还以为是文件没找到呢!!所以推荐从官方下载配置文件b. [手动狗头]写脚本递归遍历下载的tgz包目录tarballs文件夹,然后去https://registry.npmjs.org/
packaName下去下载文件。(目前还没有发现一个好用的工具就是同时去下,试过node-tgz-downloader好像不行)
b. 同一时间重新下包tgz和package.json,node-tgz-downloader是可以的!!吃了没认真看文档的亏!github readme上写得清清楚楚!反而搜的解决方案(不知道文章被反复cv了多少遍)只有下离线包,没有说必须把package.json一起带上!
再贴下花时间边gpt边写的下载package.json的脚本[😅]
const fs = require('fs');
const path = require('path');
const https = require('https');
const tarballsDir = './tarballs'; // 指定 tarballs 文件夹的路径
// 递归查找子文件夹的函数
function findInnermostFolders(dir) {
const subdirs = fs.readdirSync(dir);
// 过滤出子文件夹
const innermostFolders = subdirs.filter(subdir => {
const subDirPath = path.join(dir, subdir);
return fs.statSync(subDirPath).isDirectory();
});
if (innermostFolders.length === 0) {
// 如果没有子文件夹,返回当前目录
return [dir];
}
// 递归查找子文件夹的子文件夹
const subInnermostFolders = innermostFolders.map(subdir => {
const subDirPath = path.join(dir, subdir);
return findInnermostFolders(subDirPath);
});
// 使用 flat() 方法将多维数组展平为一维数组
return subInnermostFolders.flat();
}
// 获取最里面的文件夹路径
const innermostFolders = findInnermostFolders(tarballsDir)?.map(str=>str.split('tarballs/')?.[1])
// 下载 package.json 文件并保存到相应的文件夹中
innermostFolders.forEach(dirPath => {
const packageJsonPath = path.join(tarballsDir, dirPath, 'package.json');
// 检查是否已经存在 package.json 文件
if (fs.existsSync(packageJsonPath)) {
console.log(`package.json already exists in ${dirPath}. Skipping download.`);
} else {
const packageJsonUrl = `https://registry.npmjs.org/${dirPath}`;
https.get(packageJsonUrl, (response) => {
let data = '';
response.on('data', (chunk) => {
data += chunk;
});
response.on('end', () => {
try {
// 保存 package.json 文件到相应的文件夹
fs.writeFileSync(packageJsonPath, data);
console.log(`Downloaded and saved package.json for ${dirPath}`);
} catch (error) {
console.error(`Error downloading package.json for ${dirPath}: ${error.message}`);
}
});
}).on('error', (error) => {
console.error(`Error downloading package.json for ${dirPath}: ${error.message}`);
});
}
});
package.json中dependency的版本 : Major.Minor.Patch 主版本号(Major):当进行不兼容的 API 变化时增加。 次版本号(Minor):当添加向后兼容的新功能时增加。 补丁版本号(Patch):当进行向后兼容的修复时增加。
^ 允许1.2.3升级到1.3.3 ~ 只允许1.2.3升级到1.2.x
当npm install时,如果package.json中,依赖的版本是^或者~,【在没有npm缓存的情况下】装包后就会使用最新的小版本,有缓存的话,还是会安装缓存的版本,所以在外网装包时,必须先清除缓存npm cache clean --force
保证装包都是最新的tar包。
之前内网仓库包装包经常遇到integrety校验失败 sha-512码不对,这里直接在外网搭个verdaccio环境,然后把package.json
和package-lock.json
放文件夹里执行npm install,装包之后把外网容器环境的verdaccio/storage/data下的文件拷出来,放内网仓库即可(integrety基本上校验没问题),个别包可在registry.npm.org里单独下载
完全不需要手动用node-tgz-downloader
下载 🤮
background: 在vdi纯内网环境搭建Npm仓库,使用
verdaccio
镜像直接启动仓库,项目中的包打算下载到仓库内存放包的地方