【问题标题】:How do I include a .gitignore file as part of my npm module?如何将 .gitignore 文件包含在我的 npm 模块中?
【发布时间】:2021-09-03 21:43:36
【问题描述】:

我正在构建一个 npm 模块,它将为某些软件项目生成特定的项目模板。因此,当开发人员安装我的 npm 模块并运行它时,我希望程序以某种方式创建文件和文件夹。

我想包含在项目模板中的一个这样的文件是 .gitignore 文件,因为软件项目将假定它将通过 git 跟踪它。但是,当我在模块上调用“npm install”时,npm 会将我所有的 .gitignore 文件重命名为 .npmignore 文件。分发模块时,如何确保我的 .gitignore 文件不被 npm 篡改?

【问题讨论】:

    标签: javascript node.js git npm scaffolding


    【解决方案1】:

    目前 npm 不允许将 .gitignore 文件作为 npm 包的一部分包含在内,而是将其重命名为 .npmignore

    一种常见的解决方法是在发布之前将.gitignore 重命名为gitignore。然后作为初始化脚本的一部分,将gitignore 文件重命名为.gitignore。在Create React App中使用了这种方法

    这是在 Node 中的操作方法,代码来自 Create React App init script

      const gitignoreExists = fs.existsSync(path.join(appPath, '.gitignore'));
      if (gitignoreExists) {
        // Append if there's already a `.gitignore` file there
        const data = fs.readFileSync(path.join(appPath, 'gitignore'));
        fs.appendFileSync(path.join(appPath, '.gitignore'), data);
        fs.unlinkSync(path.join(appPath, 'gitignore'));
      } else {
        // Rename gitignore after the fact to prevent npm from renaming it to .npmignore
        // See: https://github.com/npm/npm/issues/1862
        fs.moveSync(
          path.join(appPath, 'gitignore'),
          path.join(appPath, '.gitignore'),
          []
        );
      }
    

    【讨论】:

      【解决方案2】:

      https://github.com/npm/npm/issues/1862

      看起来这是一个已知问题。底部的答案似乎是推荐的方法。如果问题或链接被破坏:

      对我们来说,我认为一个更好的解决方案是明确的文档,如果作者希望在他们的生成器中使用 .gitignore,他们需要将他们的文件命名为 .##gitignore##,这将是一个值 gitignore 集到同一个字符串 gitignore。

      这样,作为模板文件发布到 npm 的文件被称为 .##gitignore## 并且不会被 npm 捕获,但随后它会被替换为 .gitignore 的字符串。

      【讨论】:

        【解决方案3】:

        你可以看到处理npm issue 1862的多个提交:

        • this project adds a rename.json:

          lib/init-template/rename.json
          {
              ".npmignore": ".gitignore",
          }
          
        • this one renames the .gitignore:

          templates/default/.gitignore → templates/default/{%=gitignore%}
          
          index.js
          @@ -114,6 +114,10 @@ generator._pkgData = function (pkg) {
              + // npm will rename .gitignore to .npmignore:
              + // [ref](https://github.com/npm/npm/issues/1862)
              + pkg.gitignore = '.gitignore';
          

        【讨论】:

        • 我无缘无故地取消了这个 2 年以上的老问题,因为目前(2017 年)被投票的答案正是我当时所说明的。
        【解决方案4】:

        编辑:即使这个答案导致 .gitignore 包含在已发布的包中(由 unpkg 证明),在运行 npm install 时,.gitignore 文件只是删除!所以即使让 NPM 包含该文件也是不够的。

        另一种解决方案(更简单的 imo):

        在 repo 中同时包含 .gitignore .npmignore。将以下内容添加到您的 .npmignore 文件中:

        !.gitignore
        !.npmignore
        

        现在.npmignore 已经存在于发布的包中,NPM 不会重命名.gitignore

        【讨论】:

        • 它不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 2017-04-05
        • 2020-12-16
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        相关资源
        最近更新 更多