He movido toda mi configuración de linting y paquetes / plugins / presets relacionados (para prettier, stylelint, eslint, commitlint) a un paquete npm. Luego uso este paquete en múltiples proyectos y extiendo o fusiono la configuración en archivos de configuración locales para los proyectos para garantizar la coherencia y eliminar la necesidad de instalar y mantener actualizadas mis dependencias de desarrollo.

Junto con la configuración, tengo una serie de scripts npm útiles que ejecutan las linters y realizan una variedad de otras funciones relacionadas con el desarrollo, por ejemplo:

"lint:prettier": "prettier 'src/**/*.{js,json}' --write",
"lint:eslint": "eslint 'src/**/*.js'",
"lint:compatibilityCheck": "eslint --print-config .eslintrc.js | eslint-config-prettier-check",
"lint": "npm run lint:compatibilityCheck && npm run lint:prettier && npm run lint:eslint"

Actualmente están duplicados en todos mis proyectos, pero me gustaría distribuir estos scripts junto con mi paquete compartido para que se definan en una sola ubicación. ¿Cómo debería hacer esto?

9
Undistraction 10 sep. 2018 a las 15:52

3 respuestas

La mejor respuesta

De npm blog, parece que no hay "formas directas" de exponer scripts de desarrollo en un paquete npm. La publicación del blog sugiere crear archivos JavaScripts que ejecuten sus scripts preferidos utilizando el módulo shelljs.

Ejemplo : suponiendo que desea exponer lint:prettier": "prettier 'src/**/*.{js,json}' --write"

Envuelva la llamada dentro de bin / lintprettier.js:

#! /usr/bin/env node
var shell = require("shelljs");
const path = require("path")

process.env.PATH += (path.delimiter + path.join(process.cwd(), 'node_modules', '.bin'));
shell.exec("prettier 'src/**/*.{js,json}' --write");

Luego agréguelo a los scripts de consola exportados en su package.json:

...
"bin": {
   "lint-prettier": "bin/lintprettier.js"
}
...

Finalmente, puede reutilizar su script en su proyecto:

"scripts": {
   "build": "...",
   "lint:prettier": "lint-prettier"
 }
2
Cristiano 12 dic. 2019 a las 14:23

No estoy seguro de que sea correcto intentar y permitir que una dependencia cambie la configuración dependiente, incluso si supiera una manera fácil de hacerlo.

En lugar de intentar ir de abajo hacia arriba, haga lo contrario. Recomiendo usar lerna.

Es una gran herramienta para administrar paquetes en un monorepo, e incluso puede elevar dependencias compartidas entre sus paquetes, y para su problema, permite definir además de todos sus paquetes, un package.json principal donde puede definir el { {X1}} s solo una vez, y ejecútalo para todos los paquetes (o solo algunos de ellos usando la función scope) con un solo comando.

0
jony89 17 sep. 2018 a las 04:53

Una forma de hacerlo es con Builder.

Builder le permite enviar scripts npm como paquetes NPM y ejecutarlos en cualquier proyecto en el que haya instalado ese paquete que contiene los scripts.

En mis casos de uso, pongo todos mis scripts de build / test / lint en un paquete NPM, luego instalo este paquete en todos mis otros proyectos. Luego, en cada proyecto, puedo ejecutar exactamente los mismos comandos.

Builder no está muy bien mantenido últimamente, pero es bastante estable y lo he usado con mucho éxito. El archivo README es muy completo y describe casi todo lo que necesita saber.

Sin embargo, la respuesta de Cristiano también es buena, ya que seguir ese enfoque puede permitirle tener un mayor control de la implementación de la solución, mientras que con Builder es otro proyecto con su propia implementación (y pocos problemas).

0
trusktr 9 feb. 2020 a las 21:17