如何在npm workspaces monorepo中生成独立可部署的app目录?
解决npm Workspaces Monorepo生成独立可部署目录的问题
这里有两个实用的方案可以生成完全独立的app部署目录,解决软链接和依赖缺失的问题:
方案一:打包本地依赖为tgz包,安装实体文件
这个方法会把你的内部私有包转换成可安装的压缩包,彻底消除软链接:
- 分别进入
server/、store/、utils/目录,执行命令:
每个目录会生成一个类似npm pack@my-scope-server-1.0.0.tgz的压缩包(名称由对应包的name和version字段决定)。 - 修改
app/package.json中的依赖配置,把file:路径替换为对应tgz文件的相对路径:{ "dependencies": { "@my-scope/server": "../server/@my-scope-server-1.0.0.tgz", "@my-scope/store": "../store/@my-scope-store-1.0.0.tgz", "@my-scope/utils": "../utils/@my-scope-utils-1.0.0.tgz" } } - 进入
app/目录,执行:
此时npm会将这些tgz包解压到npm install --workspaces=falseapp/node_modules中,同时自动安装这些内部包自身的依赖。最终得到的app目录完全独立,没有任何软链接,可直接打包部署到Azure。
方案二:使用npm的--install-links参数直接复制依赖
如果你的npm版本在7.0及以上,可以直接用内置参数跳过软链接,复制实体文件:
- 进入
app/目录,执行命令:npm install --workspaces=false --install-links - 这个命令会让npm把
file:协议引用的内部包完整复制到app/node_modules目录,而不是创建软链接,同时自动安装这些内部包的所有依赖。 - 执行完成后,
app/node_modules/@my-scope下的子目录都是实际的文件,而非链接,整个app目录可以直接打包部署。
注意事项
- 方案一需要在内部包代码更新后,重新执行
npm pack并更新app/package.json中的依赖路径,适合需要稳定版本快照的场景。 - 方案二更适合快速构建,无需修改依赖配置,但要确保环境中的npm版本符合要求(执行
npm -v可查看版本)。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

