【问题标题】:Why is my Node.js package missing the main file when installed globally?为什么我的 Node.js 包在全局安装时缺少主文件?
【发布时间】:2020-05-29 17:19:34
【问题描述】:

这感觉像是一个令人尴尬的问题,但我最近向 NPM 注册表发布了一个 Node 包,现在发现它不起作用。

问题似乎是我的主文件 ./src/index.js 未包含在全局安装中。

  • 我知道这是因为当我从命令行调用包时 按预期在包中运行./bin/cli.js,但随后抛出:

    Error: Cannot find module '../src/index.js'
    Require stack:
    - /usr/lib/node_modules/diffcraft/bin/cli.js
    

    错误甚至引用了./bin/cli.js 中的行,其中索引 文件是必需的,所以这肯定是问题所在。

  • 我也知道这一点,因为我检查了模块所在的文件夹 全局安装,当bin 文件夹在那里时,src 文件夹不是。所以我的包的主要代码不存在。

发现这一点后,我什至对 package.json 进行了修补,以确保 ./src/index.jsfiles 数组中被明确列入白名单。我之前没有这样做过,因为NPM guidance 指出main 下列出的任何文件也会自动列入白名单。但即使在files 中明确包含该文件也不起作用。

作为参考,我没有.npmignore 文件。

我有一种可怕的感觉,我错过了一些简单而基本的东西......有什么想法可能会跳过我的主文件吗?

包裹是diffcraft

【问题讨论】:

  • 如果您包含指向存储库的链接,这里的人可能会为您提供更好的帮助,这样我们就可以准确地看到您拥有的内容、package.json 中的内容、存储库中的内容等......
  • @jfriend00 - 运行npm repo diffcraft 命令会将您带到 github 存储库。
  • 仅供参考,这与全局安装没有任何关系。如果在本地安装,也会出现同样的问题。 src 目录不包含在安装中。
  • 从您的项目中完全省略 files 字段/键 package.json - 两个文件的路径名已经通过 mainbin 定义.
  • 我看到您发布的 npm 模块 registry.npmjs.org/diffcraft/-/diffcraft-0.1.1.tgz 的存档不包含所需的目录。因此,发布过程中似乎出现了问题。

标签: node.js npm npm-install


【解决方案1】:

如果您在文件前面省略./,它会起作用(在 Windows 上使用 npm 6.14.4 测试):

  "files": [
    "bin/cli.js",
    "src/index.js"
  ],

这可能是 npm 中的一个错误。

您可以通过运行npm pack 并检查存档文件来检查此内容而无需发布。

替代方案是使用.npmignore 文件。

【讨论】:

  • 但是为什么默认不包含src目录呢?您不必为它们显式命名目录以使其成为包的一部分,对吗?
  • main 字段中省略./ 并完全删除files 数组似乎具有相同的效果。出于某种原因,bin 字段不需要相同;无论有没有./,都会被接收。我不知道为什么,但这种方法似乎有效——我将再进行一些测试......
  • 附言。仅提及npm pack 就赞成这个答案。谢谢你。
  • PPS。还发现 npm publish --dry-run 在这方面很有用。
  • 这似乎已经解决了。我最终从mainbin 文件的路径名中删除了./,并将files 作为一个空数组保留(因为这似乎比创建.npmignore 以排除我文件夹中的所有其他内容更经济) )。感谢您的帮助!
猜你喜欢
  • 2021-05-28
  • 2012-07-27
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
相关资源
最近更新 更多