安装本地模块时忽略 .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的主要内容,如果未能解决你的问题,请参考以下文章
在 Perl 脚本中使用 File::Find 时忽略整个目录