web-dev-qa-db-fra.com

Répertoire racine dans package.json

Ma question concerne une bibliothèque existante que je souhaite publier en tant que module NPM. La bibliothèque est déjà utilisée et, à l'heure actuelle, required via le système de fichiers local.

Comment puis-je spécifier le répertoire racine des fichiers de mon module?

Si j'ai une structure comme:

.
├── package.json
├── src
|   ├── js
|   └────── lib
|   └───────── my
|   └───────────── thing.js
|   └───────────── that.js

Comment spécifier que la racine de mon module et des fichiers accessibles est src/js/lib/my/?

Je voudrais utiliser comme suit d'un projet extérieur:

var thing = require('my/thing'),
    that = require('my/that');

J'ai vu la propriété "files" dans package.json, est-ce la bonne façon de faire?

40
Drahcir

Pour une solution native, consultez ce problème de noeud https://github.com/nodejs/node/issues/14970

La demande de fonctionnalité suggère un champ mainDir dans le package.json en regard de main.

Plus il y a de gens qui votent, plus la mise en œuvre sera rapide/probable

7
Jordan Whitfield

Comme le doc dit:

Le champ principal est un ID de module qui constitue le point d'entrée principal de votre programme.

Donc, vous aurez quelque chose comme "main": "src/js/lib/my/app.js" dans votre fichier package.json.

Je vous suggère de créer un fichier app.js et module.exports vos différents enfants. Par exemple:

 module.exports.thing = require('./thing');
 module.exports.that = require('./that');

Et utilisez-les comme ceci:

var mylib = require('mylib')
  , thing = mylib.thing
  , that = mylib.that;
6
Yann Bertrand

package.json est principalement un fichier utilisé par npm pour installer et gérer les dépendances.

la construction require ne se soucie pas beaucoup de package.json et vous ne pourrez donc pas l'utiliser pour subvertir le fonctionnement de require et lui faire croire que les paquets ne sont pas ceux où le schéma de chargement require est prévu.

Voir la documentation sur https://nodejs.org/api/modules.html et le schéma de chargement ici: https://nodejs.org/api/modules.html#modules_all_together

vous pourriez peut-être utiliser la technique selon laquelle la documentation appelle «Chargement à partir des dossiers globaux» et définir la variable d'environnement NODE_PATH.

mais je vous conseille de vous en tenir à une manière plus standard: - Placez vos modules dans un répertoire node_modules - ou démarrez la hiérarchie de vos modules dans le même répertoire que votre app.js ou index.js

2
Jerome WAGNER

Il s’agit maintenant d’une solution de contournement moche qui pollue la racine de votre package. Mais jusqu'à ce que la réponse de Jordan fonctionne, cela semble être le moyen de réaliser ce que vous demandez. 

Ajoutez simplement un fichier à la racine de votre paquet pour chacun des modules que vous souhaitez exporter en utilisant la notation require with slash. Ce fichier aura le même nom que le module en cours d’exportation et sera simplement réexporté. 

.
├── package.json
├── thing.js       <--
├── that.js        <--
├── src
|   ├── js
|   └────── lib
|   └───────── my
|   └───────────── thing.js
|   └───────────── that.js

Par exemple, le fichier ./thing.js contiendra: 

module.exports = require('./src/js/lib/my/thing');

Et vous pouvez donc en avoir besoin comme:

const thing = require('mypackage/thing');

De même, comme indiqué dans le bogue relatif à l'ajout de la propriété mainDir à package.json , vous pouvez simplement copier temporairement vos sources et le fichier package.json dans un répertoire et les publier à partir de là.

1
kub1x

Dans webpack, vous pouvez spécifier resolve.alias comme ceci:

{
  resolve: {
    alias: {
      'my': 'my/src'
    }
  }
}

ou vous pouvez spécifier l'option directions dans package.json

{
  directions: {
    'lib': 'src/lib'
  }
}
0
刘联东