npm - ¿Cómo se usan las propiedades ''archivos'' y ''directorios'' en package.json?
(1)
Si un
package.json
tiene un
files
prop, y / o un
directories
prop:
"files": [
"./src/assets/fonts/"
],
"directories": {
"assets:": "./src/assets"
}
¿Cuáles son algunas formas de hacer uso de ellos? La documentación no menciona lo que se puede hacer con ellos una vez que se han especificado.
Por ejemplo, los documentos docs dicen:
El campo "archivos" es una matriz de archivos para incluir en su proyecto. Si nombra una carpeta en la matriz, también incluirá los archivos dentro de esa carpeta.
¿Qué significa "incluir en su proyecto"? Incluir dónde? ¿Cómo son accesibles ahora que no lo eran antes?
En la sección de directorios , los documentos dicen:
En el futuro, esta información puede usarse de otras formas creativas.
¿Cuáles son las formas creativas existentes en que se está utilizando?
"incluir en su proyecto" significa que los archivos estarán en el paquete tar que se crea cuando ejecuta
npm publish
.
También puede ejecutar el
npm pack
para generar el tarball para inspección sin realmente activar una publicación.
De esta manera, puede abrir el tarball generado e inspeccionar qué archivos se incluyeron o no.
Mientras que
.npmignore
(o
.gitignore
como proxy, si no
.npmignore
) funciona como una lista negra de archivos para ignorar (por lo tanto, incluye todo lo demás de forma predeterminada), la matriz de
files
es una lista blanca.
Es decir, en lugar de incluir todo de manera predeterminada, si se especifica la matriz de
files
todo se excluye de manera predeterminada y solo los archivos enumerados explícitamente se incluirán en el paquete tar.
Como ejemplo, supongamos que su paquete es una biblioteca destinada al consumo en el navegador.
Su código está en
lib/
, y ejecuta browserify para compilar en una lib compatible con el navegador en
dist/index.js
.
Comienza con un montón de archivos listados en
.gitignore
, que se usa como el defacto
.npmignore
que no existe.
Pero ahora que
dist/
está lleno de archivos generados, desea que se ignoren del repositorio de git.
Si los agrega a
.gitignore
, se excluirán del repositorio de git,
pero también se ignorarán del paquete tarball
.
Entonces tiene dos opciones: duplicar su
.gitignore
como
.npmignore
pero solo enumere
dist/
in
.gitignore
.
Si hace esto, tendrá que mantener dos archivos casi sincronizados.
De esta manera es tedio y propenso a errores.
La otra alternativa es no tener un
.npmignore
, y simplemente enumerar los archivos que realmente desea en el paquete, en la matriz de
files
.
README.*
,
package.json
,
CHANGELOG.*
(
CHANGELOG.*
vez un par de otros) se incluyen automáticamente en el tarball independientemente.
Entonces simplemente agrega
"files": [ "dist" ]
y listo.
Ahora su paquete tarball no incluirá la fuente original JS de
lib
, ni
tests/
etc, sino que solo contendrá la lib compilada real en
dist/
.
En cuanto a los
directories
, normalmente enumero las fuentes
lib
(para es5),
src
(para es6, coffeescript, mecanografiado, etc.),
dist
(para compilaciones específicas de navegador o vm),
test
,
output
(para archivos generados temporalmente como informes de cobertura, etc. ),
doc
, etc. Aunque esta propiedad no es utilizada directamente por npm u otras herramientas, hace explícita la estructura del directorio.
Además, hace que los directorios sean referenciables en scripts npm de la siguiente manera:
"scripts": {
"clean": "rm -rf $npm_package_directories_dist $npm_package_directories_output",
"lint": "eslint $npm_package_directories_src",
"test": "teenytest $npm_package_directories_test",
}
De esta manera, los directorios se especifican solo una vez, y si cambian, solo necesitan cambiarse en una única ubicación (en lugar de muchas en todo el paquete.json).