npm全局包:从包中引用内容文件

时间:2018-04-25 15:57:17

标签: javascript node.js npm scaffolding

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

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

3 个答案:

答案 0 :(得分:2)

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

  

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)
})

答案 1 :(得分:0)

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

  1. 假设您的全局模块安装在名为$ PATH的目录中。如果您的软件包将安装在任何计算机上,它将基本上在该目录中提取。

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

  3. 假设您将模板编辑为字符串,然后想将其本地写入用户希望/ pwd的位置,您只需使用process.cwd()来获取该目录的路径。这完全取决于你如何编码。

  4. 如果您只想在npm包中明确包含这些文件,请使用package.json的files属性。

  5. 至于回答"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返回的路径将其作为参考。

答案 2 :(得分:0)

当您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;

甜!