node.js - npm 链接不关心 package.json 或 .npmignore 中的 "files"

标签 node.js npm package.json npmignore

我的目标是在发布 Node 模块之前指定哪些文件将包含在 Node 模块中,并能够在本地测试安装。使用 package.json 中的"file"的效果是,如果我发布包并安装它,那么我只能获得"file"中指定的内容。

当我使用 npm 链接时,情况并非如此。无论是 package.json 中的"file"还是 .npmignore,npm 链接似乎总是为我提供每个文件。如何像这样在本地测试我的模块安装?

例如:

cd ~/projects/node-redis    # go into the package directory
npm link                    # creates global link
cd ~/projects/node-bloggy   # go into some other package directory.
npm link redis              # link-install the package

如果 ~/projects/node-redis 的 package.json 中有“files: [lib]”,那么在运行“npm link redis”后,您会期望只有 lib 出现在 ~/projects/node-bloggy 中,但是事实并非如此。

旁白: 我喜欢 Node 和 npm,但是如果您查看 Node 模块中的内容,就会发现自述文件中使用了很多无关的文件,例如 PNG。因此模块变得异常巨大。

更新:

npm install <path>

根据此处的答案和 stackoverflow 上的其他答案,似乎尊重 package.json 中的"file"。我不能代表其他系统,但对于 Fedora Linux 上的 npm v 6.9.0,这不起作用,因为所有文件仍然被复制。

示例:

如果您需要一个已发布的模块来测试此场景,我最近发布了没有依赖项的 num2cheque。如果您使用

从 npm 注册表安装它,您会看到
npm install num2cheque

您没有收到我本地的测试目录,因为我在 package.json 中指定了

"files": [lib]

将测试目录添加到本地安装,然后尝试使用 npm link 或 npm install 和路径,您将看到测试目录现已包含在内。希望能说明问题。

最佳答案

解决方法:npm install GIT 存储库 URL

您可能想从 GIT 存储库安装软件包,例如

npm install https://github.com/AndreasPizsa/parse-decimal-number.git

这是一个实际的 npm install,它尊重 files 条目,即使该包尚未发布到 npm 存储库。

<小时/>

背景

npm link 不会复制,它会创建一个链接

npm link 确实没有通过将包复制到目标文件夹来实际安装该包。

相反,它会创建一个指向源文件夹的符号链接(symbolic link),这就是为什么您会看到源文件夹(“node-redis”)中的所有文件,而不仅仅是在文件

此行为记录在 npm 链接 文档中:

First, npm link in a package folder will create a symlink in the global folder {prefix}/lib/node_modules/ that links to the package where the npm link command was executed. (see npm-config for the value of prefix). It will also link any bins in the package to {prefix}/bin/{name}.

Next, in some other location, npm link package-name will create a symbolic link from globally-installed package-name to node_modules/ of the current folder.

https://docs.npmjs.com/cli/link.html

“什么是符号链接(symbolic link)?”您可能会问:

a symbolic link (also symlink or soft link) is a term for any file that contains a reference to another file or directory in the form of an absolute or relative path and that affects pathname resolution.

https://en.wikipedia.org/wiki/Symbolic_link

如果您担心硬盘空间的使用,请不用担心 - 不会复制或重复任何内容,只会链接(就像链接到维基百科不会重复它一样,它实际上节省了空间)

...本地运行 npm install 也是如此

npm install 以及包的路径还将创建指向相关包的符号链接(symbolic link)。一个有用的场景可能是仍在开发中的模块。

cd ~/projects/node-bloggy
npm install ~/projects/node-redis

这将在您的 node-bloggy 项目中的 node_modules 下创建一个符号链接(symbolic link)。

关于node.js - npm 链接不关心 package.json 或 .npmignore 中的 "files",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46679732/

相关文章:

javascript - 如何知道 node-webkit 应用程序是否以管理员/提升权限运行?

node.js - 从 NPM 包中导出多个模块

node.js - 我到底应该如何处理 webpack 上的 "module.exports = ' html_template_content'"

javascript - 如何让 npm 包 bin 使用实验模块选项运行?

javascript - 通过 package-lock.json 减轻差异噪音

node.js - mongodb不会从nodejs启动

node.js - 项目: sahat/hackathon-starter: Error: ENOENT,没有这样的文件或目录

node.js - npm ls 匹配模式吗?

node.js - 让 NodeJS 与 VS2015 一起工作

reactjs - 基于 .env 变量创建 React App : Set HTTPS flag in package. json