Jak opublikować pakiet npm z plikami dystrybucyjnymi?

126

Chciałbym opublikować pakiet npm zawierający moje pliki źródłowe i dystrybucyjne. Moje repozytorium Github zawiera srcfolder zawierający pliki źródłowe JavaScript. Proces kompilacji generuje distfolder zawierający pliki dystrybucyjne. Oczywiście distfolder nie jest wpisywany do repozytorium Github.

Jak opublikować pakiet npm w taki sposób, że gdy ktoś to zrobi npm install, dostanie srcrównież distfolder? Obecnie, gdy uruchamiam npm publishz mojego repozytorium git, srcpublikowany jest tylko folder.

Mój plik package.json wygląda następująco:

{
  "name": "join-js",
  "version": "0.0.1",
  "homepage": "https://github.com/archfirst/joinjs",
  "repository": {
    "type": "git",
    "url": "https://github.com/archfirst/joinjs.git"
  },
  "main": "dist/index.js",
  "scripts": {
    "test": "gulp",
    "build": "gulp build",
    "prepublish": "npm run build"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  }
}
Naresh
źródło

Odpowiedzi:

102

Spójrz na pole „files” w pliku package.json https://docs.npmjs.com/files/package.json#files

Z dokumentacji:

Pole „pliki” to tablica plików, które mają zostać uwzględnione w projekcie. Jeśli nazwiesz folder w tablicy, będzie on również zawierał pliki w tym folderze. (Chyba że zostaną zignorowani przez inną regułę).

Eugene Nezhuta
źródło
3
Jestem ciekawy, czy pole "pliki" zastępuje, .gitignoreczy .npmignore(wydaje się, że nie, gdy czytam dokument) - @Naresh, powiedz nam, który sposób działał dobrze.
topheman
8
„pliki” rzeczywiście ignorują .gitignore. Mam plik „dist” w moim .gitignore, ale zawarty w „plikach”, a folder jest publikowany na npm. "files" wydaje się być sposobem publikowania kilku popularnych pakietów, takich jak expess i bluebird (podczas gdy są inne pakiety, które używają metody .npmignore). Na razie wybieram „pliki”, ponieważ wydaje się to być bardziej bezpośredni sposób na powiedzenie, co opublikować. Ale dziękuję wam obojgu za co najmniej dwukrotne zwiększenie mojej wiedzy o npm dzisiaj!
Naresh
3
Warto zauważyć, że jeśli podano "pliki", to tylko te pliki są jedynymi, które są zawarte w twoim projekcie (inne niż pliki, których nie można wykluczyć, takie jak package.json itp.)
bmacnaughton
176

Kiedy ty npm publish, jeśli nie masz .npmignorepliku, npm użyje twojego .gitignorepliku (w twoim przypadku wykluczyłeś distfolder).

Aby rozwiązać problem, utwórz .npmignoreplik na podstawie swojego .gitignorepliku, bez ignorowania folderu dist .

Soure: https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

topheman
źródło
3
dziękuję za szybką odpowiedź. Twoja odpowiedź jest z pewnością poprawna, ale na razie kieruję się podejściem „plików” sugerowanym przez Eugene'a, ponieważ wydaje mi się ono bardziej bezpośrednie. Proszę zobaczyć mój szczegółowy komentarz pod jego odpowiedzią.
Naresh
3
Dziękuję bardzo!
corvid
0

Minimalny przykład użycia plików danych ze skryptu

Innym częstym przypadkiem użycia jest posiadanie plików danych, których muszą używać twoje skrypty.

Można to łatwo zrobić za pomocą technik wymienionych w: W node.JS jak mogę uzyskać ścieżkę do modułu, który załadowałem za pomocą wymagania, które jest * nie * moje (tj. W jakimś module node_module)

Pełny przykład można znaleźć pod adresem:

W tej konfiguracji plik mydata.txtjest umieszczany node_modules/cirosantilli-data-files/mydata.txtpo instalacji, ponieważ dodaliśmy go do naszego files:wpisu package.json.

Nasza funkcja myfuncmoże następnie znaleźć ten plik i użyć jego zawartości przy użyciu require.resolve. Oczywiście działa również na pliku wykonywalnym ./cirosantilli-data-files.

package.json

{
  "bin": {
    "cirosantilli-data-files": "cirosantilli-data-files"
  },
  "license": "MIT",
  "files":  [
    "cirosantilli-data-files",
    "mydata.txt",
    "index.js"
  ],
  "name": "cirosantilli-data-files",
  "repository": "cirosantilli/linux-kernel-module-cheat",
  "version": "0.1.0"
}

mydata.txt

hello world

index.js

const fs = require('fs');
const path = require('path');

function myfunc() {
  const package_path = path.dirname(require.resolve(
    path.join('cirosantilli-data-files', 'package.json')));
  return fs.readFileSync(path.join(package_path, 'mydata.txt'), 'utf-8');
}
exports.myfunc = myfunc;

cirosantilli-data-files

#!/usr/bin/env node
const cirosantilli_data_files = require('cirosantilli-data-files');
console.log(cirosantilli_data_files.myfunc());

is-installed-globallyPakiet jest następnie przydatna, jeśli chcesz wygenerować ścieżki względne do plików rozproszonych w zależności czy są one zainstalowane lokalnie lub globalnie: Jak sprawdzić, czy pakiet został zainstalowany npm globalnie lub lokalnie

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło