npm instala y crea un repositorio de github bifurcado

125

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 installme 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.

hughesjmh
fuente

Respuestas:

139

Intente npm install <ghusername>/<repoName>, dónde <ghUsername>está su nombre de usuario de GitHub (sin el @) y <repoName>es el nombre del repositorio. Eso debería instalarlo correctamente. Lo más probable es que desee utilizar el indicador --saveo --save-devcon el comando de instalación para guardar la dependencia en su package.json.

Si eso no funciona correctamente, verifique el contenido de su .npmignorearchivo.

No entre en pánico si el comando de instalación lleva mucho tiempo; la instalación desde un repositorio git es más lenta que la instalación desde el registro npm.


Editar:

Su problema es que, en su caso, dist/no está comprometido con el repositorio (ya que está en el .gitignore). Ahí es donde vive el código real. dist/se src/crea a partir de los archivos antes de que el paquete se publique en el registro npm, pero dist/nunca se compromete con el repositorio.

Es feo, pero en este caso se tendrá que eliminar dist/de la .gitignorey luego ejecutar:

npm run build
git add .
git commit
git push

(Asegúrese de haber corrido npm installprimero)

Entonces debería poder instalar desde github.

Puede haber otra forma de hacer esto usando un postinstallscript, pero no estoy seguro de si eso es posible; Nunca lo he intentado.

RyanZim
fuente
2
Sí, esa fue más o menos la solución. También tuve que hacer una instalación npm y modificar un poco el GruntFile, pero eso lo hizo funcionar. Gracias por tu ayuda :)
hughesjmh
2
¿Realmente no hay otra forma de hacerlo que no sea ignorar dist? Quiero hacer un PR para el repositorio original, pero con la molestia, ¿no le va a gustar?
Ka Mok
77
@KaMok Creo que otra opción es, en el package.jsonarchivo de la bifurcación, debajo scripts, cambiar el nombre prepublisha prepare. Parece que cuando npm installo npm install github:user_name/fork_name --save(y lo mismo para el hilo) se ejecuta, también ejecuta lo que hay en el preparescript. Esto supone que la prepublishsecuencia de comandos de este paquete crea los archivos de compilación, que suele ser el caso.
davidfrancisco
55
y si necesita una rama específica,npm install <ghusername>/<repoName>#branchName
DrMeers
2
@RyanZim Estás incorrecto. La instalación desde git funciona muy bien siempre que esté configurada correctamente. docs.npmjs.com/cli/install~~V~~3rd "Si el paquete se está instalando contiene una preparesecuencia de comandos, su dependenciesy devDependenciesse instalarán, y el guión se ejecutará el preparar, antes de que el paquete se envasa y se instala."
Cameron Tacklind
15

Actualización para aquellos que usan npm 5:

A partir de npm @ 5, los prepublishscripts están en desuso.

Úselo preparepara pasos de compilación y solo prepublishOnlypara carga.

Encontré que agregar un "prepare": "npm run build"a los scripts solucionó todos mis problemas.

Simón
fuente
Eso también funcionó para mí (en un tenedor que acabo de hacer) - ¡gracias! Me pregunto ... ¿por qué no todos los paquetes solo incluyen esta configuración de script por defecto? ¿Es porque los autores de paquetes solo consideran el caso de uso de instalar su paquete desde npm y no el caso de instalarlo desde un repositorio git? Entonces, ¿están acostumbrados a correr manualmente npm run buildy npm run publishno tienen ningún problema o dolor a menos que algún día intenten instalar el repositorio a través de git?
Tyler Rick el
9

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 npmejecutar automáticamente un paso de "compilación" antes de publicar ( npm publish). Esto fue originalmente llamado prepublish. Parece que Npm pensó que sería útil también ejecutar el prepublishscript en una, npm installya 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: prepublishOnlyy prepare.

prepublishOnlyhace lo que esperas No se ejecuta npm 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 preparese agregó para manejar ...

prepare es la forma correcta

Si tiene un repositorio con archivos fuente pero es necesario un paso de "compilación" para usarlo,
preparehace exactamente lo que desea en todos los casos (a partir de npm 4).

prepare: Ejecute ambos ANTES de que el paquete esté empaquetado y publicado, en local npm installsin ningún argumento, y al instalar dependencias de git.

Incluso puede poner sus dependencias de compilación devDependenciesy se instalarán antes de prepareejecutarse.

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 filessección de package.json.

Uno podría ver que por filesdefecto 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 la filesdirectiva y , si .npmignoreno existe, .gitignorese usa en su lugar.

Por lo tanto, si usted tiene sus ficheros producidos enumerados en .gitignorecomo una persona sana, y no hace nada más, preparese parece roto

Si decide filesincluir 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

Cameron Tacklind
fuente
1
PREPARE funcionó para mí en lugar de POSTINSTALL.i simplemente ejecuté npm run build en prepare.
Milind
6

Aprovechar la excelente respuesta de @ RyanZim, postinstalldefinitivamente es una opción válida para esto.

Realice uno de los siguientes:

  1. Actualice package.json en su repositorio bifurcado para agregar un elemento postinstall a los scripts. Aquí, ejecute lo que necesite para obtener el resultado compilado (Preferido).
  2. Actualice su package.json y agregue un postinstall que actualice el directorio necesario en node_modules.

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.

Mike B
fuente
¿Puedes explicar o tener algún recurso sobre cómo hacer el # 2? ¿Qué comandos necesito ejecutar después de la instalación de npm cuando el gitrepo solo contiene src not dist?
Daniel
1
@Daniel Disculpas, estoy tratando de recordar el contexto de dónde hice esto en el pasado. Creo que con el n. ° 2 quise agregar un paso posterior a la instalación a sus paquetes principales. Json que ejecutaría los pasos para la respuesta principal, por lo que debería "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.
Mike B
Creo que debería preferirse agregar para preparar (la respuesta de @ Simon), porque si realiza la instalación desde npm, no necesitaría realizar ninguna construcción adicional porque ya debería incluir un dist / dir. Consulte docs.npmjs.com/misc/scripts : "prepare: Ejecute ambos ANTES de que el paquete esté empaquetado y publicado, ... y cuando instale dependencias de git"
Tyler Rick
postinstallestá a un paso de la solución correcta. Solo úsalo prepare. Es 2020.
Cameron Tacklind
2

Solo usa el comando npm install git+https://[email protected]/myRepo/angular-translate.git. Gracias.

Bimal Jha
fuente