安装本地模块时忽略 .npmignore

Posted

技术标签:

【中文标题】安装本地模块时忽略 .npmignore【英文标题】:.npmignore ignored when installing local module 【发布时间】:2018-07-11 15:44:51 【问题描述】:

我们所有的服务器项目都包含一个 git 子模块文件夹(比如说modules),其中包含我们的自定义模块/组件。

此类模块依赖项安装在本地(请参阅serverApp/package.json),因此我们不必将整个子模块文件夹包含到最终 rpm 中。我遇到的问题是限制node_modules 中包含的文件数量。

子模块结构如下:

modules
|--loader
   |--dist => compiled js files here that are created when installing the module
   |--ts => contains typescript files that shouldn't be included in node_modules
   |--package.json
   |--tsconfig.json
|--more modules
|--.gitignore

modules/loader 中添加.npmignore 文件似乎没有帮助,因为整个文件夹都被复制了。

modules/loader/tsconfig.json:


  "compilerOptions": 
    "target": "es6",
    "module": "commonjs",
    "declaration": true,
    "outDir": "./dist",
    "strict": true
  

modules/loader/package.json:


  "name": "loader",
  "version": "1.2.0",
  "private": true,
  "description": "",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "scripts": 
    "preinstall": "npm run build",
    "build": "../../node_modules/typescript/bin/tsc",
    "test": "echo \"Error: no test specified\" && exit 1"
  ,
  "dependencies": 
    "@types/lodash": "^3.9.3",
    "@types/nomnom": "0.0.28",
    "@types/yamljs": "^0.2.30",
    "lodash": "^3.9.3",
    "nomnom": "^1.8.1",
    "yamljs": "^0.2.1"
  ,
  "devDependencies": 
    "typescript": "~2.3.4"
  

serverApp/package.json:


  "name": "my-server-app",
  "version": "2.3.0",
  "description": "",
  "main": "myServerApp.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1"
  ,
  "license": "private",
  "dependencies": 
    "loader": "file:modules/loader"
  ,
  "devDependencies": 
    "grunt": "^0.4.5",
    "grunt-cli": "^0.1.13"
  

我不确定这是否与我们有 .gitignore file 的事实有关,或者因为该模块未在本地发布和安装。

npm 版本 => 5.3.0

编辑

也不适用于在 modules/loader/package.json 中指定 "files"

【问题讨论】:

【参考方案1】:

您提到您不想将“整个子模块”包含在“最终 rpm”中,我认为您最终会准备这个包。我复制了类似的设置并添加了一个“.npmignore”来忽略我使用npm install --save ./task_in 安装的“子模块”,其中“task_in”是我的模块,位于主包(“task”)“package.json”旁边。

当最终包在“任务”文件夹中使用npm pack 准备时,我得到了一个没有文件夹(“任务_in”)的包(tar 文件),如“.npmignore”中所示。

不过,在工作时,我发现模块“task_in”文件夹被复制到“node_modules”,它自动不包含在最终包中(参考here)。此外,在准备包时,“.gitignore”会被“.npmignore”覆盖。

所以,这是我的“两分钱”,希望对您有所帮助。

【讨论】:

我们没有使用npm pack,而是使用 Grunt 创建 rpm 你是如何使用 grunt 制作 rpm 的?有什么插件吗? 主要是grunt-easy-rpm 要配置 grunt-easy-rpm,请尝试使用 grunt 配置文件中的“excludeFiles”键排除文件,(查看文档 - npmjs.com/package/grunt-easy-rpm#excluding-files)。 但在创建 rpm 之前,这些文件夹已经添加到 node_modules。我无法对每个模块中的每个文件夹进行硬编码。问题出在 npm 上。它不应该首先复制文件夹【参考方案2】:

结帐后,我发现了以下需要提及的有用点:

我们使用 .npmignore 文件将内容排除在您的包之外。 如果没有 .npmignore 文件,但有 .gitignore 文件,则 npm 将忽略 .gitignore 文件匹配的内容。

如果您想包含您的 .gitignore 文件所排除的内容,您可以创建一个空的 .npmignore 文件来覆盖它。 与 git 一样,npm 在包的所有子目录中查找 .npmignore.gitignore 文件,而不仅仅是根目录。

类似于 .gitignore 文件 .npmignore 也遵循这些规则

空白行或以 # 开头的行将被忽略,标准 glob 模式有效。

您可以使用正斜杠 / 结束模式以指定目录。

您可以通过以感叹号 !.

开头来否定模式

默认情况下,会忽略以下路径和文件,因此无需将它们显式添加到 .npmignore

此外,node_modules 中的所有内容都将被忽略,捆绑的依赖项除外。 npm 会自动为您处理此问题,因此不必费心将 node_modules 添加到 .npmignore

测试您的 .npmignore 或文件配置是否有效

如果你想仔细检查你的包在发布时是否只包含你想要的文件,你可以在本地运行 npm pack 命令,它将在工作目录中生成一个 tarball,与发布相同。

你也可以在这里查看同样的问题Consider methodologies for reducing the number of files within node_modules #14872 谢谢。

【讨论】:

【参考方案3】:

您是否与node 0.6.13 / npm 1.1.9 核对过?此问题在 npm 1.1.4 中很常见。 看看这个link

【讨论】:

我没有使用npm 1.1.4。使用的版本是5.3.0。我真的无法更改版本

以上是关于安装本地模块时忽略 .npmignore的主要内容,如果未能解决你的问题,请参考以下文章

从 exe 引用已安装的模块并忽略打包版本

让 pip 忽略现有的***

如何将 CPAN 模块安装到本地目录中?

在 Perl 脚本中使用 File::Find 时忽略整个目录

从 SVN 更新时是不是可以始终(强制)覆盖本地更改?忽略冲突?

maven多模块项目执行 deploy 时 忽略某些model (忽略war包)