无法同时使用npm link多个包

12

我在链接本地包时遇到了奇怪的错误:

我有两个包(我们称它们为 A 和 B)。当我使用 npm link A 链接其中一个包到我的项目中时,它按预期工作。但当我尝试链接另一个包时,使用 npm link B ,它被链接了,但 A 的链接消失了。我没有收到任何错误消息,只是以下内容:

已添加 5 个软件包,删除 5 个软件包,更改了 2 个软件包,并在 5 秒内审核了 121 个软件包

3 个软件包正在寻求资金,请运行 npm fund 获取详细信息

之前这个过程没有任何问题,但今天我用 npm update 更新了一些依赖项。当我尝试重新链接我的包时,出现了问题。

也许值得一提的是,包 B 也链接了包 A。

编辑:使用 npm link A B 解决了问题。

2个回答

16

我使用npm link A B解决了我的问题。


0

我有一个类似的问题,有十几个模块,最终我使用了mock-require。

我创建了一个小模块来遍历包含所有模块的目录,并对它们进行模拟。

这个模块叫做"@my-scope/mockModules"。

const fs = require("fs-extra")
const path = require("path")
const mockRequire = require("mock-require")

// traverse directories,skipping "node_modules"
function traverseDir(directory, options, callback) {
  const files = fs.readdirSync(directory)
  
  for(const file of files) {
    const filepath = path.join(directory, file)
    const stat = fs.statSync(filepath)

    if (stat.isDirectory()) {
      if (options.exclude_folders === undefined || options.exclude_folders.indexOf(file) === -1) {
        traverseDir(filepath, options, callback)
      }
    } else {
      callback(file, filepath, directory)
    }
  }
}

// read all packages, to check if the module is in my scope
function getPackages(root) {
  const packages = []

  traverseDir(root, {
    exclude_folders: ["node_modules"]
  }, (name, path, directory) => {
    if(name === "package.json") {
      try {
        const content = require(path)

        packages.push({
          path,
          directory,
          content
        })
      } catch(error) {
        console.error(`could not open ${path}`)
      }
    }
  })

  return packages
}

// get an array of all packages, and paths for the modules in my scope, mock them using mock-require

function mockModules(rootFolder, scope) {
  let packages = getPackages(`${__dirname.split(rootFolder)[0]}${rootFolder}`)
  packages = packages.filter(pack => pack.content.name.indexOf(`${scope}/`) == 0)

  console.log("mocking")

  for(const pack of packages) {
    const path = `${pack.directory}/${pack.content.main}`
    console.log(`    ${pack.content.name} ${path}`)
    mockRequire(pack.content.name, path)
  }
}

module.exports = mockModules

这是如何使用它的:

const mockModules = require("@my-scope/mockModules")
mockModules("my-scope", "name of root folder")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接