Node.js 在工作区中安装单个包的生产依赖项
我正在尝试仅为工作区中的单个软件包安装生产依赖项。可能吗 我已经试过了:Node.js 在工作区中安装单个包的生产依赖项,node.js,yarnpkg,Node.js,Yarnpkg,我正在尝试仅为工作区中的单个软件包安装生产依赖项。可能吗 我已经试过了: 工作区安装中的我的软件包--prod 但它正在安装我所有软件包的所有生产依赖项。您可以试试 据我所知,Thread workspace@my monorepo/my package in workspace安装--prodThread 1不支持它 如果您试图在dockerfile中安装特定软件包,则有一种解决方法: 复制warn.lock文件和root package.json 仅复制您需要的包的package.json
工作区安装中的我的软件包--prod
但它正在安装我所有软件包的所有生产依赖项。您可以试试
据我所知,Thread workspace@my monorepo/my package in workspace安装--prodThread 1不支持它 如果您试图在dockerfile中安装特定软件包,则有一种解决方法:
warn.lock
文件和root package.json
warn install
- 确定性安装-建议在monorepos中这样做,以强制确定性安装-
FROM node:12
WORKDIR /usr/project
COPY yarn.lock package.json remove-all-dev-deps-from-all-package-jsons.js change-version.js ./
ARG package_path=packages/dancer-placing-manager
COPY ${package_path}/package.json ./${package_path}/package.json
RUN node remove-all-dev-deps-from-all-package-jsons.js && rm remove-all-dev-deps-from-all-package-jsons.js
RUN yarn install --frozen-lockfile --production
COPY ${package_path}/dist/src ./${package_path}/dist/src
COPY ${package_path}/src ./${package_path}/src
CMD node --unhandled-rejections=strict ./packages/dancer-placing-manager/dist/src/index.js
remove-all-dev-deps-from-all-package-jsons.js:
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
async function deleteDevDeps(packageJsonPath) {
const packageJson = require(packageJsonPath)
delete packageJson.devDependencies
await new Promise((res, rej) =>
fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf-8', error => (error ? rej(error) : res())),
)
}
function getSubPackagesPaths(repoPath) {
const result = execSync(`yarn workspaces --json info`).toString()
const workspacesInfo = JSON.parse(JSON.parse(result).data)
return Object.values(workspacesInfo)
.map(workspaceInfo => workspaceInfo.location)
.map(packagePath => path.join(repoPath, packagePath, 'package.json'))
}
async function main() {
const repoPath = __dirname
const packageJsonPath = path.join(repoPath, 'package.json')
await deleteDevDeps(packageJsonPath)
await Promise.all(getSubPackagesPaths(repoPath).map(packageJsonPath => deleteDevDeps(packageJsonPath)))
}
if (require.main === module) {
main()
}
现在看来,纱线2很容易做到这一点:
但我自己还没试过 以下是我对纱线1的解决方案:
#为整个monorepo安装依赖项,因为
# 1. 未实现--ignore workspace标志https://github.com/yarnpkg/yarn/issues/4099
# 2. --focus标志已损坏https://github.com/yarnpkg/yarn/issues/6715
#避免将目标工作区依赖项放在根节点_模块中。
sed-i的|“依赖项”:|“工作空间”:{“nojack”:[“**”]},“依赖项”:| g'apps/target app/package.json
#运行“纱线安装”两次以解决问题https://github.com/yarnpkg/yarn/issues/6988
纱线
#找到所有链接的节点_模块并取消对它们的引用,以便没有断开的节点
#如果目标应用程序被复制到某个位置,则符号链接。(不要使用
#`cp-rL apps/target app some/destination`
#节点_modules/.bin/*并因此断开它们。)
cd应用程序/目标应用程序/节点\u模块
对于美元中的f(查找-maxdepth 1-类型l)
做
l=$(readlink-f$f)和rm$f和cp-rf$l$f
完成
现在可以复制应用程序/目标应用程序
,并将其作为独立应用程序使用
我不推荐它用于生产。它的速度很慢(因为它为整个monorepo安装了依赖项),而且不太可靠(因为符号链接可能会有其他问题)