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安装--prod

Thread 1不支持它

如果您试图在dockerfile中安装特定软件包,则有一种解决方法:

  • 复制
    warn.lock
    文件和root package.json

  • 仅复制您需要的包的package.json:您的包以及包所依赖的其他包(在monorepo中本地)

  • 在dockerfile中,手动删除您复制的所有package.json的所有devdependence

  • 在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安装了依赖项),而且不太可靠(因为符号链接可能会有其他问题)