【问题标题】:npm global packages: Reference content files from packagenpm 全局包:从包中引用内容文件
【发布时间】:2018-10-06 04:28:49
【问题描述】:

我正在构建一个将在全球范围内安装的 npm 包。是否可以将非代码文件与可以从代码文件引用的代码文件一起安装?

例如,如果我的包包含someTextFile.txtmodule.js 文件(而我的package.json 包含"bin": {"someCommand":"./module.js"}),我可以将someTextFile.txt 的内容读入内存module.js 中吗?我该怎么做?

【问题讨论】:

  • 第一个问题,为什么是 txt 文件……第二个问题,该文件的路径重要吗?
  • @Hackerman 不一定是.txt 文件。我的想法是我想构建一个 cli 工具(在 node.js 中,通过 npm 发布和分发),它可以引用未存储在代码中的数据。在我的特殊情况下,我想构建一个脚手架工具,它在运行时会选择一个模板文件,稍微转换模板文件,然后将结果保存在运行脚手架任务的本地目录中。该工具需要模板文件的路径,以便在执行时可以读取该文件。
  • 在我看来,npm 包只是一个带有package.json 的文件夹。因此,如果您包含其他文件,例如 .txt 文件,它应该是可访问的。您想知道它是否可以访问,或者如何访问它?因为对于后者,您似乎可以像访问常规文件一样访问这些文件。
  • @mgul 这也是我对 npm 的理解。我想我的问题可以改写为“我的 npm 包中的代码文件如何找到全局安装的 npm 文件夹的路径,它所在的位置可以保证跨操作系统工作并且是未来的证明?”一旦我有了它,我就可以构建该文件夹中各个文件的路径,并将它们作为普通文件进行交互。
  • 我认为您应该研究这个问题:stackoverflow.com/questions/10265798/… 它本质上为您提供了访问项目根目录以访问那里文件的方法。

标签: javascript node.js npm scaffolding


【解决方案1】:

以下是一个将文件(字符串)的内容加载到全局范围内的模块示例。

core.js:主模块文件(package.json的入口点)

//:Understanding: module.exports
module.exports = {
 reload:(cb)=>{ console.log("[>] Magick reloading to memory"); ReadSpellBook(cb)}
}
//:Understanding: global object
//the following function is only accesible by the magick module
const ReadSpellBook=(cb)=>{
 require('fs').readFile(__dirname+"/spellBook.txt","utf8",(e,theSpells)=>{
  if(e){ console.log("[!] The Spell Book is MISSING!\n"); cb(e)}
  else{ 
    console.log("[*] Reading Spell Book") 
    //since we want to make the contents of .txt accesible :
    global.SpellBook = theSpells // global.SpellBook is now shared accross all the code (global scope)
    cb()//callBack
  }
 })
}
//·: Initialize :.
console.log("[+] Time for some Magick!")
ReadSpellBook((e)=>e?console.log(e):console.log(SpellBook))

spellBook.txt

ᚠ   ᚡ   ᚢ   ᚣ   ᚤ   ᚥ   ᚦ   ᚧ   ᚨ   ᚩ   ᚪ   ᚫ   ᚬ   ᚭ   ᚮ   ᚯ
ᚰ   ᚱ   ᚲ   ᚳ   ᚴ   ᚵ   ᚶ   ᚷ   ᚸ   ᚹ   ᚺ   ᚻ   ᚼ   ᚽ   ᚾ   ᚿ
ᛀ   ᛁ   ᛂ   ᛃ   ᛄ   ᛅ   ᛆ   ᛇ   ᛈ   ᛉ   ᛊ   ᛋ   ᛌ   ᛍ   ᛎ   ᛏ
ᛐ   ᛑ   ᛒ   ᛓ   ᛔ   ᛕ   ᛖ   ᛗ   ᛘ   ᛙ   ᛚ   ᛛ   ᛜ   ᛝ   ᛞ   ᛟ
ᛠ   ᛡ   ᛢ   ᛣ   ᛤ   ᛥ   ᛦ   ᛧ   ᛨ   ᛩ   ᛪ   ᛫   ᛬   ᛭   ᛮ   ᛯ

如果您从另一段代码中需要它,您将看到它如何打印到控制台并自行初始化。

如果您想实现手动初始化,只需删除最后 3 行 (·: Initialize :.) 并使用 reload()

const magick = require("core.js")
magick.reload((error)=>{ if(error){throw error}else{ 
  //now you know the SpellBook is loaded
  console.log(SpellBook.length)
})

【讨论】:

    【解决方案2】:

    我已经构建了一些私人分发的 CLI,所以我相信我可以在这里稍微说明一下。

    1. 假设您的全局模块安装在名为 $PATH 的目录中。当你的包被安装在任何机器上时,它基本上会被解压到那个目录。

    2. 当您从任何终端启动someCommand 时,将调用保存在$PATH 中的module.js。如果您最初将模板文件保存在与您的包相同的目录中,那么它将出现在module.js 的本地位置。

    3. 1234563这完全取决于你如何编码。
    4. 如果您只想在 npm 包中显式包含文件,请使用 package.json 的 files 属性。

    至于特别回答"how can my code file in the npm package locate the path to the globally installed npm folder in which it is located in a way that is guaranteed to work across OSes and is future proof?",这与您试图实现的模板非常不同。无论如何,您在这里只是问的是 npm 模块的全局路径。作为故障安全选项,请在您的代码中使用 require.main.filename 返回的路径作为参考。

    【讨论】:

      【解决方案3】:

      当您npm publish 时,它会将文件夹中的所有内容打包,不包括.npmignore 中注明的内容。 (如果您没有.npmignore 文件,它将挖掘到.gitignore。请参阅https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package)所以简而言之,是的,您可以将文本文件打包到您的模块中。安装模块(本地或全局)将以您期望的方式将文本文件放置到位。

      安装后如何找到文本文件? __dirname 给你当前文件的路径……如果你问得够早的话。见https://nodejs.org/docs/latest/api/globals.html#globals_dirname(如果你在闭包内使用__dirname,它可能是封闭函数的路径。)对于“未来”的近期,这看起来不会改变,并且会起作用在所有情况下都符合预期 - 模块是本地安装还是全局安装,以及其他模块是依赖模块还是直接安装。

      所以让我们假设文本文件与当前运行的脚本位于同一目录中:

      var fs = require('fs');
      var path = require('path');
      var dir = __dirname;
      
      function runIt(cb) {
        var fullPath = path.combine(__dirname, 'myfile.txt');
        fs.readFile(fullPath, 'utf8' , function (e,content) {
          if (e) {
            return cb(e);
          }
          // content now has the contents of the file
          cb(content);
        }
      }
      
      module.exports = runIt;
      

      甜!

      【讨论】:

        猜你喜欢
        • 2012-11-01
        • 2022-01-25
        • 2021-05-19
        • 1970-01-01
        • 2021-11-11
        • 2019-12-22
        • 1970-01-01
        • 2017-11-05
        • 2020-10-23
        相关资源
        最近更新 更多