我正在构建一个全局安装的npm包。是否可以将非代码文件与可以从代码文件引用的代码文件一起安装?
例如,如果我的包中包含someTextFile.txt
和module.js
文件(我的package.json
包含"bin": {"someCommand":"./module.js"}
),我可以将someTextFile.txt
的内容读入module.js
中的记忆?我该怎么做?
答案 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,所以我相信我可以在这里说明一点。
假设您的全局模块安装在名为$ PATH的目录中。如果您的软件包将安装在任何计算机上,它将基本上在该目录中提取。
当您从任何终端启动someCommand
时,将调用保存在$ PATH的module.js
。如果您最初将模板文件保存在与包相同的目录中,那么它将出现在module.js
本地的位置。
假设您将模板编辑为字符串,然后想将其本地写入用户希望/ pwd
的位置,您只需使用process.cwd()
来获取该目录的路径。这完全取决于你如何编码。
如果您只想在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
返回的路径将其作为参考。
答案 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;
甜!