Esta no es una pregunta totalmente nueva, pero he estado buscando por un buen tiempo y tengo problemas para encontrar una solución.
Estoy usando un módulo para mi aplicación angular llamado angular-translate. Sin embargo, he tenido que hacer algunas pequeñas modificaciones en el código fuente para que todo funcione de la manera que me gustaría, y ahora quiero persistir en esos cambios npm install
. Un colega me sugirió que bifurcara el repositorio del código fuente y señalara mi repositorio bifurcado como una dependencia, que he intentado de esta manera, por ejemplo
npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz
El primero me da un directorio como este sin compilación. Solo un paquete.json, .npmignore y algunos archivos de descuento
-angular-translate
.npmignore
.nvmrc
CHANGELOG.md
package.json
etc
El segundo npm install
me da el repositorio completo, pero nuevamente no obtengo una compilación como cuando uso el comando npm install angular-translate
. He visto algunas dudas sobre cómo ejecutar el script de prepublicación, pero no estoy seguro de cómo hacerlo al instalar todos los módulos. También intenté publicar la bifurcación como mi propio módulo en el registro npm, pero nuevamente no obtengo compilación, y no estoy seguro de que sea lo correcto ...
Pido disculpas por mi ignorancia sobre el tema. No tengo mucha experiencia con npm. Me encantaría recibir algunos comentarios sobre este tema. Parece que podría ser un problema bastante común cuando se necesitan hacer modificaciones al código fuente de un paquete. Tal vez hay una mejor solución? Gracias de antemano por tu ayuda.
fuente
package.json
archivo de la bifurcación, debajoscripts
, cambiar el nombreprepublish
aprepare
. Parece que cuandonpm install
onpm install github:user_name/fork_name --save
(y lo mismo para el hilo) se ejecuta, también ejecuta lo que hay en elprepare
script. Esto supone que laprepublish
secuencia de comandos de este paquete crea los archivos de compilación, que suele ser el caso.npm install <ghusername>/<repoName>#branchName
prepare
secuencia de comandos, sudependencies
ydevDependencies
se instalarán, y el guión se ejecutará el preparar, antes de que el paquete se envasa y se instala."Actualización para aquellos que usan npm 5:
Encontré que agregar un
"prepare": "npm run build"
a los scripts solucionó todos mis problemas.fuente
npm run build
ynpm run publish
no tienen ningún problema o dolor a menos que algún día intenten instalar el repositorio a través de git?El código publicado en npmjs.com a menudo no es lo que está en el repositorio del paquete. Es común "compilar" archivos fuente JavaScript en versiones destinadas al consumo general en bibliotecas. Eso es lo que generalmente se publica en npmjs.com.
Es tan común que es una característica de
npm
ejecutar automáticamente un paso de "compilación" antes de publicar (npm publish
). Esto fue originalmente llamadoprepublish
. Parece que Npm pensó que sería útil también ejecutar elprepublish
script en una,npm install
ya que esa era la forma estándar de inicializar un entorno de desarrollo.Esto terminó llevando a una gran confusión en la comunidad. Hay problemas muy largos en github sobre esto.
Al final, en un esfuerzo por no cambiar el comportamiento anterior, decidieron agregar dos scripts automáticos más:
prepublishOnly
yprepare
.prepublishOnly
hace lo que esperas No se ejecutanpm install
. Muchos mantenedores de paquetes simplemente cambiaron ciegamente a esto.Pero también existía este problema de que la gente no quería depender de npmjs.com para distribuir versiones de paquetes. Los repositorios Git fueron la elección natural. Sin embargo, es una práctica común no enviar archivos "compilados" a git. Eso es lo que
prepare
se agregó para manejar ...prepare
es la forma correctaSi tiene un repositorio con archivos fuente pero es necesario un paso de "compilación" para usarlo,
prepare
hace exactamente lo que desea en todos los casos (a partir de npm 4).Incluso puede poner sus dependencias de compilación
devDependencies
y se instalarán antes deprepare
ejecutarse.Aquí hay un ejemplo de un paquete mío que usa este método.
Problemas con
.gitignore
Hay un problema con esta opción que atrae a muchas personas. Al preparar una dependencia, Npm y Yarn mantendrán solo los archivos que se enumeran en la
files
sección depackage.json
.Uno podría ver que por
files
defecto se incluyen todos los archivos y pensar que están listos. Lo que se pasa por alto fácilmente es que en.npmignore
su mayoría anula lafiles
directiva y , si.npmignore
no existe,.gitignore
se usa en su lugar.Por lo tanto, si usted tiene sus ficheros producidos enumerados en
.gitignore
como una persona sana, y no hace nada más,prepare
se parece rotoSi decide
files
incluir solo los archivos creados o agregar un vacío.npmignore
, ya está todo listo.Mi recomendación es configurar
files
(o, por inversión.npmignore
) , de modo que los únicos archivos realmente publicados sean los necesarios para los usuarios del paquete publicado. En mi opinión, no hay necesidad de incluir fuentes no compiladas en los paquetes publicados.Respuesta original: https://stackoverflow.com/a/57503862/4612476
fuente
Aprovechar la excelente respuesta de @ RyanZim,
postinstall
definitivamente es una opción válida para esto.Realice uno de los siguientes:
Si ha bifurcado el repositorio de otra persona, puede valer la pena plantear un problema para ilustrar el problema de que instalar su paquete a través de GitHub no funciona, ya que no proporciona los medios necesarios para construir el script. A partir de ahí, pueden aceptar un RP para resolver esto con un postinstall, o pueden rechazarlo y usted puede hacer el # 2.
fuente
"postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"
asegurarse de que el paquete que le causa problemas se construya antes de que se ejecute su aplicación. Sin embargo, como dije, prefiero el enfoque de bifurcar el repositorio a mi propio usuario, agregar el postinstall al paquete en sí y usarlo en mi aplicación.postinstall
está a un paso de la solución correcta. Solo úsaloprepare
. Es 2020.Solo usa el comando
npm install git+https://[email protected]/myRepo/angular-translate.git
. Gracias.fuente