No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Crear un paquete para NPM

12/15
Recursos

Al crear un paquete para NPM, podrás compartir tu trabajo a varios desarrolladores y utilizar tu código mediante npm install. Te mostraré un ejemplo, un proyecto de mensajes aleatorios que estará instalado globalmente y se ejecutará mediante la terminal.

Proyecto de mensajes aleatorios

Crea el directorio del proyecto y el archivo package.json mediante npm init. Inicia un repositorio local de Git con git init. Al momento de publicar un paquete, el proyecto debe tener un nombre único, puedes agregar tu nombre de usuario para diferenciarlo, pero no agregues números, ya que NPM lo detecta como spam.

Dentro del proyecto crea la siguiente estructura de archivos:

  • Un directorio llamado src que contenga el archivo principal del proyecto index.js
  • Un directorio llamado bin que contenga un archivo ejecutable global.js
Directorio base

En el archivo index.js agrega el siguiente código, un array llamado messages que contiene cinco nombres y una función randomMsgque mostrará de manera aleatoria los elementos del array. Al final, exporta la función mediante module.exports.

const messages = ["Oscar", "Ana", "Nikolai", "Diego", "Laura"];

const randomMsg = () => {
  const message = messages[Math.floor(Math.random() * mesagges.length)];
  console.log(mesagge);
};

module.exports = { randomMsg };

En el archivo global.js agrega el siguiente código, en el que importamos el la función del archivo index.js y la ejecutamos.

#!/usr/bin/env node
let random = require('../src/index.js');

random.randomMsg();

⠀⠀
#!/usr/bin/env node es una instancia de una línea shebang, la primera línea en un archivo de texto plano ejecutable en plataformas similares a Unix que le dice al sistema: a qué intérprete debe pasar ese archivo para su ejecución, a través del comando línea siguiendo la magia #! prefijo.
⠀⠀
En el archivo package.json, agrega "bin" haciendo referencia a nuestro archivo global.js y "preferGlobal" en true (el signo + representa las líneas de código a añadir).

{
  "name": "random-mesagges-<tuUsuario>",
  "version": "1.0.0",
  "description": "Vamos a crear un paquete para NPM",
  "main": "src/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Tu Nombre <[email protected]>",
  "license": "MIT",
+"bin": {
+  "random-msg": "./bin/global.js"
+ },
+ "preferGlobal": true
}

¡Listo! Ya tienes configurado el proyecto para publicarlo en NPM.

Contribución creada con aportes de: Andrés Guano y areyouivan.

Aportes 43

Preguntas 19

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Ejecutar el comando para saber donde estoy ubicado

pwd
mkdir random-messages
cd random-messages/
git init
npm init

Se crea el archivo index.js en la carpeta src

// Se declara el arreglo
const messages = [
    "David",
    "Diana",
    "Ana Maria",
    "Isabela",
    "Antonio",
    "Norma"
]

//Crear función para enviar aleatoriamente  los nombres del arreglo
const randomMsg = () => {
    const message = messages[Math.floor(Math.random()*messages.length)]
    console.log(message)
}

// Exportar como un módulo

module.exports = { randomMsg }

Se debe crear una carpeta bin donde se crea ele archivo global.js (Configuración que se necesita)

#!/usr/bin/env node
// se va ejecutar dentro de bash

//Variable que llama la funcion que exportamos
let random = require('../src/index.js')

//Ejecuto la funcion
random.randomMsg()

Modifico el package.json y coloco la configuración de bin que necesito

  "bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true

#!/usr/bin/env node es una instancia de una línea shebang : la primera línea en un archivo de texto plano ejecutable en plataformas similares a Unix que le dice al sistema a qué intérprete debe pasar ese archivo para su ejecución , a través del comando línea siguiendo la magia #! prefijo (llamado shebang ).

Nota: Windows no admite líneas shebang , por lo que efectivamente se ignoran allí; en Windows es solo la extensión del nombre de archivo de un archivo dado que determina qué ejecutable lo interpretará. Sin embargo, todavía los necesita en el contexto de npm .

Muy bueno este vídeo como crear un paquete para NPM ME GUSTA de hecho me dio muchas ideas de crear unos módulos y compartirlos

Crear un paquete para NPM

⠀⠀
En esta clase crearemos un paquete para poder publicarlo.
⠀⠀
Inicializamos nuestro como hemos aprendido con git init y npm init .
⠀⠀
Dentro crearemos nuestra carpeta src donde vivirá nuestro código y otra de bin
⠀⠀

⠀⠀
Creamos un archivo index.js y colocamos lo siguiente.
⠀⠀

const messages = ["Oscar", "Ana", "Nikolai", "Diego", "Laura"];

const randomMsg = () => {
  const message = messages[Math.floor(Math.random() * mesagges.length)];
  console.log(mesagge);
};

module.exports = { randomMsg };

⠀⠀
Estamos creando un array llamado messages → que vivirá dentro de una función(randomMsg). Ahí iniciamos una constante cuyo valor llama al array, pero con la función Math.floor() que redonda nuestros valores hacía abajo y dentro Math.random() el cuál multiplicamos por la longitud del array.
⠀⠀
Por último llamamos un console.log() que nos mostrará el mensaje random.
⠀⠀
Dentro de la carpeta bin crearemos un archivo llamado global. Escribimos la siguiente linea:
⠀⠀

#!/usr/bin/env node
let random = require('../src/index.js');

random.randomMsg();

⠀⠀
Iniciamos random importando nuestro código de index.js. Luego lo llamamos para ejecutar el programa.
⠀⠀
#!/usr/bin/env node
Es una instancia de una línea shebang, la primera línea en un archivo de texto plano ejecutable en plataformas similares a Unix que le dice al sistema; a qué intérprete debe pasar ese archivo para su ejecución, a través del comando línea siguiendo la magia #! prefijo (llamado shenbang).
⠀⠀
Vamos a editar nuestro archivo package.json.
⠀⠀
Debajo de “license” definimos bin, colocamos nuestro script y su ruta. Después seteamos “preferGlobal” con true

{
  "name": "random-mesagges",
  "version": "1.0.0",
  "description": "Vamos a crear un paquete para NPM",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Iván García <[email protected]>",
  "license": "MIT",
  "bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true

}

Si no sabes el significado de #!/usr/bin/ …
te recomiendo ir al Curso de Introducción a la Terminal y Línea de Comandos ahí te explican como poder utilizar más comandos como ese.

Excelente clase.
Solo dejo como aporte que Math es un objeto y floor es un método.

Una forma de ejecutar el programa sin tener que setear el bin, aclaro que solo es para probar, es con el siguiente comando en consola:

npx node src/index.js

O también es un script en el package.json:

"scripts": {
    "start": "node src/index.js"
  },

En consola se ejecuta:

npm run start

COMO SE CORRE EN WINDOWS?

Estoy usando gitbash como consola. Mi compu es windows. Por lo tanto en vez de escribir sudo npm link escribo solo npm link. Mi consola la abrí como administrador. Está eso correcto? Obtengo el siguiente error agradezco si alguien me pudiera ayudar.

`npm WARN [email protected] No repository field.

up to date in 1.157s
found 0 vulnerabilities

npm ERR! code ENOENT
npm ERR! syscall chmod
npm ERR! path C:\Program Files (x86)\Nodist\bin\node_modules\js-random-messages.bin\global.js
npm ERR! errno -4058
npm ERR! enoent ENOENT: no such file or directory, chmod 'C:\Program Files (x86)\Nodist\bin\node_modules\js-random-messages.bin\global.js’
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\Cristobal\AppData\Roaming\npm-cache_logs\2020-06-23T22_31_57_854Z-debug.log
`

Crear un paquete para NPM

Debemos tener nuestra aplicación dentro de la carpeta src y de ahí exportar nuestro archivo main o en este caso el index.js.

luego de esto, en la raíz creamos otra carpeta llamada bin que contendrá un archivo js llamado global.js en el cual vamos a crear la configuración necesaria para llamar nuestra paquete desde la consola.

También tenemos que configurar nuestro package.json en el que vamos añadirle un nuevo apartado llamado bin dentro de el vamos a registrar el paquete que estamos creando, al cual le damos un nombre que en este caso es llamado “random-msg” y finalizamos activando la opción ‘preferGlobal’.

No pense que era tan adictivo estudiar en platzi 3:04am argentina! Pero estoy feliz y sin trabajo desde la pandemia! nunca pares de aprender! PlatziSalu2!

¿Por qué se desestructura el nombre de la función?

RESUMEN DE LA CLASE.

  • Crea un proyecto, en este caso random de mensajes.
  • En la terminal se fija estar en el entorno de trabajo y crea carpeta del proyecto.
  • Se mueve a la carpeta e inicializa el proyecto: con git, luego con npm.
  • Completa todas las opciones de información sobre el proyecto. El entry point lo coloca en la carpeta “src/index.js” (después tiene que crear la carpeta y el archivo), la licencia es MIT, el autor ya queda seteado en la maquina del proyecto anterior.
  • Entra al archivo creado con el comando code, que abre visual studio code (al archivo package.json). Estando en Visual Studio Code crea la carpeta src y dentro el archivo index.js donde va a vivir el proyecto (en este caso el random de mensajes, como va a funcionar, como va a añadir la configuración dentro del package y como lo va a inicializar).
  • Crea la lógica del proyecto: un array de nombres y una función que mediante un random muestra en consola alguno de los nombres del array.
  • Para exportar la función que muestra los nombres utiliza:
    module.exports = { nombreDeLaFuncion };
  • Crea una nueva carpeta que va a llamar bin. Ahí va a estar la configuración para que este paquete que estamos creando sea un paquete que se instala de forma global.
  • Dentro de la carpeta crea un archivo que se llama global.js
  • Dentro de este archivo, establece que es un elemento que se va a ejecutar dentro del sistema bash con esta primer linea
    #!/usr/bin/env node
  • Genera una variable con el nombre random y le coloca un require, luego la ejecuta con la funcion que habiamos creado antes.
  • let random = require(’ …/src/index.js’ );
  • random.randomMsg(); //randomMsg es el nombre de la funcion que habiamos creado en el archivo index.js
  • De esta forma vamos a poder ejecutar este comando dentro de la terminal al escribir el nombre que hay que setear a continuacion.
  • En el archivo package.json creamos un apartado que llamamos bin y dentro creamos el nombre del comando y hacemos que llame al archivo global.js
    tambien debemos configurar que este paquete sea de forma global. Para eso agregamos el siguiente valor
    "preferGlobal": true
  • Entonces lo que agregamos en package.json quedaria asi:
    “bin”: {
    “random-msg”: “./bin/global.js”
    },
    “preferGlobal”: true

Vaya, que genial el poder aprender a cómo hacer un paquete para NPM ^^ Aunque aún me quedan dudas de cómo funcionaría, a ver los demás capítulos:D!

<code>
{
  "name": "random-messages",
  "version": "1.0.0",
  "description": "random de mensajes",
  "main": "src/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "javascript",
    "node",
    "npm"
  ],
  "author": "Yojan Hungria <[email protected]>",
  "license": "(MIT)",
  "bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true
}

<code>

#!/usr/bin/env node 

let random = require('../src/index.js');

random.randomMsg();
<code>
const messages = [
    "Yojan",
    "Ana",
    "Yessica",
    "Diana",
    "Laura"
];

const randomMsg = () => {

    const message = messages[Math.floor(Math.random() * messages.length)];
    console.log(message);

};

module.exports = { randomMsg}


Es interesante crear paquetes para publicarlos, puede ser muy útil para tener bloques de código que resuelven un problema específico. Así solamente instalamos nuestro paquete y lo usamos.

Para eliminar el link es como eliminar un modulo normal

sudo npm uninstall -g nombre_de_tu_modulo

Yo puse nombres de anime en el array, es más fácil aprender las cosas cuando usas algo que disfrutas.

Esta clase es escencial porque me soluciono un problema en electron para trabajar con modulos, electron no me permite trabajar con imports o exports normales. asi que debes crear tus modulos e instalarlos en tu proyecto

  • Para crea un paquete, luego de inicializar el proyecto y generar el archivo index.js, configurar bin/global.js, para ejecutar el paquete, para ello se debe establecer el shell de node #!/usr/bin/env node.
  • Configurar el archivo package.json
"bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true

IMPORTANTE en las nuevas versiones se declara distinto
yo estoy haciéndolo en la v16.14.2 (node)

//Declaramos el arreglo de mensajes.
const messages = [
    "Hello",
    "Good morning",
    "Good afternoon",
    "Good evening",
    "Good bye"
];

//Creamos la función aleatoria para el msj IMPORTANTE declarar que se va a exportar 
 export const randomMsg = ( ) => {
    const message = messages[Math.floor(Math.random()*messages.length)];
    console.log(message);
}

Recomiendo la siguiente pagina, hay información importante que puede ayudar a entender mejor y ha profundizar en el curso. Muy interesante las explicaciones.

https://lenguajejs.com/npm/administracion/crear-nuevo-proyecto/

Es interesante esta clase y el alcance de NPM

Hola!
Seguro vienes de la clase #13 buscando respuestas…
Te aparece este error?

/random-messages$ sudo npm link
>> /usr/bin/env: ‘node’: No such file or directory

Para abordar este problema te sugiero 3 pasos:
(1) Allí en la carpeta donde estas ejecuta:

node ./bin/global.js

Si el resultado es un nombre random de tu array. Todo bien.
Si esto no corre es porque hay un problema en tu función de debes revisarla (seguro es un typo 😃)
(2) Ahora ejecuta solamente:

npm link

Por alguna razón, los que instalamos node a través de NVM no necesitamos poner sudo por delante. (Si alguien sabe porqué se rompe cuando ponemos sudo, se los agradecería).
Debería correr y mostrarte algo así…

$ npm link

up to date, audited 3 packages in 1s

found 0 vulnerabilities

y eso significa que todo va bien!
Pero si te sale esto…

$ npm link
npm ERR! code EJSONPARSE
npm ERR! path /home/tommy/tomProjects/Curso-NPM/Proj-RandomMessages/package.json
npm ERR! JSON.parse Unexpected token "}" (0x7D) in JSON at position 421 while parsing near "...preferGlobal\":true,\n}\n"
npm ERR! JSON.parse Failed to parse JSON data.
npm ERR! JSON.parse Note: package.json must be actual JSON, not just JavaScript.

npm ERR! A complete log of this run can be found in:

Es porque hay un error en nuestro package.json…
Revisa que no le hayas puesto una coma al final (eso me pasó a mi)… Debería quedar así:

  "license": "MIT",
  "bin":{
    "random-msg":"./bin/global.js"
  },
  "preferGlobal":true // sin coma!!
}

Espero te ayude y que nada te detenga 💪!

Hola !!! coloquen un nombre propio en vez de:
“random-mesasages”

Ej: random-messages-pepito

sino en la siguente clase les va ha fallar por que el nombre indicado por el profe ya estara ocupado y despues toca que debggear.

pilas… saludos

a mi me gusta crear primero el repo y clonarlo para que cuando inicie mi proyecto de npm lea la mayor cantidad de valores del repo ya clonado

Despues de tener iniciado el respositorio y NPM, necesitamos crear la carpeta SRC y dentro nuestro INDEX.JS, ya que tengamos el codigo que queramos listo necesitamos crear una nueva carpeta llamada BIN la cual dentro estara la configuracion para que nuestro paquete que estamos creando, se instale de forma global.

Dentro de esta carpeta creamos un archivo Global.js y aqui iran las configuraciones y como se eejecutara de forma bash, entonces dentro utilizamos:

#!/usr/bin/env node
// se va ejecutar dentro de bash

//Variable que llama la funcion que exportamos
let random = require('../src/index.js')

//Ejecuto la funcion
random.randomMsg()

De esta forma ya podemos crear un comando para poder ejecutar los comandos con el nombre que se le asignara.

En package.json podemos crear la configuracion:

"bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true

Con esto le asignamos el comando, el archivo y de que este sea global.

Muchas gracias por compartirnos la estructura fundamental que deben tener los paquetes de npm instructor Oscar.

Ahora voy entendiendo el uso y poder que tiene NPM 🤯

vaya! primer paquete configurado!!

muy interesante…

Interesante

Resumend de la clase:

  • El proyecto es un random de mensajes con el cual al ejecutarlo podrán recibir un mensaje aleatorio.
  • Comandos: git init y npn init
  • El archivo index.js en la carpeta src va vivir nuestro proyecto.
// Se declara el arreglo
const messages = [
    "David",
    "Diana",
    "Ana Maria",
    "Isabela",
    "Antonio",
    "Norma"
];

//Crear función para enviar aleatoriamente  los nombres del arreglo
const randomMsg = () =>{
    const message = messages[Math.floor(Math.random()*messages.length)];
    console.log(messages0);
};

// Exportar como un módulo
module.exports = { randomMsg };

Se debe crear una carpeta bin donde estará la configuración para que el paquete que se eta creando se instale de forma global/ se crea el archivo global.js (Configuración que se necesita)

#!/usr/bin/env node
// se va ejecutar dentro de bash
let random = require('../src/index.js');

random.randomMsg();

#!comando

  • Es una instancia de una línea shebang.
  • La primera línea en un archivo de texto plano ejecutable en plataformas similares a Unix que le dice al sistema a qué intérprete debe pasar ese archivo para su ejecución.
  • A través del comando línea siguiendo la magia la magia #! prefijo (llamado shebang ).

Nota: Windows no admite líneas shebang , por lo que efectivamente se ignoran allí; en Windows es solo la extensión del nombre de archivo de un archivo dado que determina qué ejecutable lo interpretará. Sin embargo, todavía los necesita en el contexto de npm .

Modifico el package.json

"bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true

Con esta modificación indicamos:

  • Que es un paquete
  • Donde encontrar información de como ejecutarlo
  • De instalación global

Ctrl + l para limpiar la consola.

1️⃣ Crear un paquete para NPM

Crearemos nuestro propio paquete y publicarlo para que otros desarrolladores puedan implementarlo en su proyecto. El proyecto que vamos a crear es un random de mensajes que podrán instalar como paquete global y al ejecutar en consola un comando recibirán un mensaje aleatorio.

Configuraciones iniciales de nuestro proyecto

Primero, crearemos nuestra carpeta donde irá nuestro proyecto. Luego, nos movemos a esa carpeta y ejecutamos el comando git init que iniciará un repositorio local que después podremos subir a GitHub, entre otras plataformas.

Ahora, ejecutaremos el comando npm init donde vamos a establecer la configuración de nuestro proyecto. (en este caso iniciamos nuestro proyecto en la carpeta src/index.js)

Creando nuestro proyecto

Vamos a nuestro editor de texto y nos ubicaremos en nuestro archivo raíz donde va a vivir nuestro proyecto (src/index.js).

Dentro de nuestro archivo JavaScript crearemos un arreglo con una lista de nombres. Luego, crearemos una arrow function que guardará en una variable el resultado de unos métodos matemáticos aplicados a cada elemento de nuestro arreglo para retornarlos aleatoriamente. Y además, exportaremos este código como un módulo.

// Creamos nuestro arreglo
const nombres = [
  "Ana",
  "Sebastian",
  "María",
  "Oscar",
  "Diego",
  "Felipe",
  "Laura",
  "Daniela",
  "Valentina",
  "Elías",
];

//Crear función para enviar aleatoriamente  los nombres del arreglo
const randomMsg = () => {
  const message = nombres[Math.floor(Math.random() * nombres.length)];
  console.log(message);
};

//Exportamos la función como un módulo
module.exports = { randomMsg };

// Math.floor regresa el primer valor redondeado del metodo .random
// Math.random regresa un valor random según el número de elementos del array

Importando nuestro proyecto y haciéndolo instalable de forma global

Ahora, crearemos una nueva carpeta llamada bin donde irá toda la configuración que necesita nuestro proyecto para que se instale de forma global. Luego, crearemos un archivo global.js en esta carpeta donde irá la configuración que necesita el proyecto.

En este archivo JS, colocaremos una línea que le indica a Node que se va a ejecutar dentro de Bash, luego creamos una variable donde importemos el módulo y luego lo ejecutaremos.

//indicamos que se va a ejecutar dentro de bash
#!/usr/bin/env node

//importamos el módulo con la lógica de nuestro código
let random = require("../src/index.js");

//Ejecutamos la función de nuestro archivo index.js
random.randomMsg();

Ya que tenemos eso listo, nos vamos al archivo package.json y debajo de el apartado de “license” vamos a crear otro apartado llamado “bin” y le colocaremos como nombre del paquete “generador-msg” y como contenido la ruta del archivo global.js que está en la carpeta de bin.

Además, para que se pueda instalar de forma global colocaremos el apartado “preferGlobal” con el valor de verdadero.

"bin": {
    "generador-msg": "./bin/global.js"
  },
  "preferGlobal": true

En el archivo package.json completo se vería así

{
  "name": "generador-mensajes-random",
  "version": "1.0.0",
  "description": "A través de un comando el usuario podrá recibir distintos mensajes en la consola ",
  "main": "src/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "hola": "node bin/global.js"
  },
  "keywords": [
    "node",
    "npm",
    "javascript"
  ],
  "author": "Sebastián Arocha <[email protected]>",
  "license": "MIT",
  "bin": {
    "generador-msg": "./bin/global.js"
  },
  "preferGlobal": true
}

De esta forma ya tenemos la configuración que necesita nuestro paquete en el package.json

Recuerden que gracias a ECMAScript 6, ahora hay una nueva forma de importar módulos. Les comparto mi codigo con esta nueva implementación.

index.js

const messages = ["Oscar", "ANa", "Diego", "Jessica", "Laura", "Diana"];

const randomMsg = () => {
  const message = messages[Math.floor(Math.random() * messages.length)];
  console.log(message);
};

export default { randomMsg };

global.js

#!/usr/bin/env node
import { randomMsg } from "../src/index.js";

randomMsg;

Crear un paquete para NPM

index.js

const messages = ['santiago', 'oscar', 'ana', 'yesica', 'diego', 'laura']

const randomMsg = () => {
  const message = messages[Math.floor(Math.random() * messages.length)]
  console.log(message)
}

module.exports = { randomMsg }
  1. Se hace un arreglo con los mensajes que se van a imprimir aleatoriamente.
  2. Se crea la función que va a escoger un mensaje aleatoriamente.
    1. Se crea una constante que va a tener la operación para sacar un elemento del array aleatoriamente.
    2. Se muestra en consola el resultado.
  3. Se exporta la función mencionada.

global.js

#!/usr/bin/env node
let random = require('../src/index.js')

random.randomMsg()

Se crea una carpeta llamada bin donde va a estar el archivo de configuración que permite que el paquete se instale de manera global.

  1. El comando #!/usr/bin/env node establece que va a ser un elemento que se ejecuta en el sistema bash.
  2. Se obtiene el archivo que tiene la lógica del paquete.
  3. Se llama la clase que contiene esa lógica.

package.json

"bin": {
    "random-msg": "./bin/global.js"
  },
  "preferGlobal": true
  1. Se establece el nombre del paquete y se asigna la ubicación.
  2. Se establece que es un paquete global.

Está genial 😮!!

Muy interesante

Excelente!

Muyyy bacano todo!!

b