Глобальные пакеты npm: ссылки на файлы содержимого из пакета - PullRequest
0 голосов
/ 25 апреля 2018

Я нахожусь в процессе создания пакета npm, который будет установлен глобально.Можно ли установить файлы без кода вместе с файлами кода, на которые можно ссылаться из файлов кода?

Например, если мой пакет содержит someTextFile.txt и файл module.js (а мой package.json включает"bin": {"someCommand":"./module.js"}) можно ли прочитать содержимое someTextFile.txt в память в module.js?Как бы я это сделал?

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Я создал несколько CLI, которые были распространены в частном порядке, поэтому я думаю, что здесь можно немного осветить.

  1. Допустим, ваши глобальные модули установлены в каталоге с именем $ PATH.Когда ваш пакет будет установлен на любой машине, он будет по существу извлечен в этом каталоге.

  2. Когда вы запустите someCommand с любого терминала, module.js будетвызывается, который хранится в $ PATH.Если вы изначально сохранили файл шаблона в том же каталоге, что и ваш пакет, то он будет присутствовать в том месте, которое является локальным для module.js.

  3. Если вы отредактируете шаблон в виде строки и затем захотите записать его локально в то место, куда пожелал пользователь / pwd, вам просто нужно использовать process.cwd(), чтобы получить путь кэтот каталог.Это полностью зависит от того, как вы его закодируете.

  4. Если вы хотите явно включить файлы только в пакет npm, используйте атрибут files пакета.json.

Что касается конкретного ответа "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 в вашем коде, чтобы сохранить его в качестве ссылки.

0 голосов
/ 29 мая 2018

Когда вы 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;

Сладкие!

0 голосов
/ 25 мая 2018

Ниже приведен пример модуля, который загружает содержимое файла (строки) в глобальную область.

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