¿Debo duplicar "Peerdependences" en el campo "Dependencias" de "Package.Json"? -- pm campo con package.json camp Relacionados El problema

Should I duplicate “peerDependencies” in “dependencies” field of “package.json”?


5
vote

problema

Español

para el experimento, descargué el código fuente de > @ TypeScript-Eslint / Eslint-Plugin . Este paquete tiene dos dependencias de pares:

  {   "peerDependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"   },   "dependencies": {     "@typescript-eslint/experimental-utils": "4.11.1",     "@typescript-eslint/scope-manager": "4.11.1",     "debug": "^4.1.1",     "functional-red-black-tree": "^1.0.1",     "regexpp": "^3.0.0",     "semver": "^7.3.2",     "tsutils": "^3.17.1"   }, }   

Si ejecuto npm list Después de que se instalarán todas las dependencias, obtendré:

  npm ERR! peer dep missing: eslint@^5.0.0 || ^6.0.0 || ^7.0.0, required by @typescript-eslint/eslint-plugin@4.11.1 npm ERR! peer dep missing: eslint@*, required by @typescript-eslint/experimental-utils@4.11.1   

significa que npm quiere:

  {   "peerDependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"   },   "dependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"      // ...   } }   
Original en ingles

For experiment, I downloaded the source code of @typescript-eslint/eslint-plugin. This package has two peer dependencies:

{   "peerDependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"   },   "dependencies": {     "@typescript-eslint/experimental-utils": "4.11.1",     "@typescript-eslint/scope-manager": "4.11.1",     "debug": "^4.1.1",     "functional-red-black-tree": "^1.0.1",     "regexpp": "^3.0.0",     "semver": "^7.3.2",     "tsutils": "^3.17.1"   }, } 

If I run npm list after all dependencies will be installed, I'll get:

npm ERR! peer dep missing: eslint@^5.0.0 || ^6.0.0 || ^7.0.0, required by @typescript-eslint/eslint-plugin@4.11.1 npm ERR! peer dep missing: eslint@*, required by @typescript-eslint/experimental-utils@4.11.1 

Does it mean that npm wants:

{   "peerDependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"   },   "dependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"      // ...   } } 
     

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

@daniel_knights respondió la pregunta en su mayoría al punto. Pero también me gustaría agregar mis dos centavos también. Así que aquí va:

Tipos de dependencias en NPM:

Para entender esto, es importante comprender los diferentes tipos de dependencias en un paquete NPM. En general, hay 4 tipos de dependencias en NPM:

  1. dependencia directa (o simplemente dependency ): estas son dependencias que son absolutamente necesarias para que funcione un paquete de NPM. Si está construyendo una aplicación web con Express.js, entonces desea que se instale el <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 15 para que su aplicación se inicie. Así que esta sería una dependencia directa para su solicitud. Estos deben aparecer en la sección <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 16 de fieldtype7 .

  2. Dependencia de desarrollo : son dependencias que son útiles al desarrollar su solicitud pero no necesariamente utilizadas por el paquete de la aplicación para ejecutar. Un ejemplo de tal dependencia sería fieldtype8 . Nodejs no entiende a los tiposcript. Por lo tanto, aunque pueda estar escribiendo su solicitud en TypeScript, después de que lo ejecute a través del compilador TyperScript, se queda con JavaScript. Por lo tanto, aunque necesite agregar el paquete <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 19 durante el desarrollo, no lo necesita para que su aplicación se ejecute después de que se compile.

SO AGREGA fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 0 A SUS fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 1 Sección Tanto las dependencias como las devdescendientes. En esta etapa, puede invocar su compilador de TyPilcript para construir su solicitud. Pero después de eso, puede ejecutar fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 4 , y NPM eliminará todas las devdependencias de fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 5 . Esto reduce su tamaño de paquete de aplicación final y lo mantiene libre de cualquier dependencia de dev.

No debe referirse a ninguna dependencia de desarrollo dentro de su código fuente sin permitir que su código se recupere de forma segura y graciosa a las alternativas, ya que el paquete se eliminará de la poda.

  1. dependencia opcional : Estas son dependencias que puede especificar dentro de la sección <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 26 de fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 7 . Cuando está especificando una dependencia como opcional, le permite que la NPM sepa que "Su programa usará esta dependencia si está disponible. Si no lo es, eso también está bien."

Un escenario común donde este puede ayudarlo está utilizando los controladores de base de datos. Los controladores de la base de datos escritos en JS no son particularmente eficientes o perfectantes. Por lo tanto, es común usar un controlador con enlaces nativos (una biblioteca JS usando un paquete nativo (C / C ++) para ejecutar sus tareas). Pero el problema es que para los enlaces nativos, el paquete nativo debe instalarse en la máquina donde se está ejecutando la aplicación. Esto puede que no siempre esté disponible. Así que podemos especificar una biblioteca nativa como una opción opcional. Puede referirse a esto en el código JS como:

  fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 8  

Entonces, al instalar paquetes usando fieldtype(typeof(Point(1.0, 1.0)), :x) # --> Float64 fieldtype(Point, :x) # --> T fieldtype(Point{Int64}, :x) # --> Int64 9 , NPM también intentará instalar una dependencia opcional. Pero si no puede instalar (probablemente porque la encuadernación nativa no está disponible), no se equivocará. Simplemente publicará una advertencia y seguirá adelante.

y ahora al tipo de dependencia en la pregunta ...

  1. dependencia de pares : Como ya sabe, estas son dependencias que especifique dentro del list030 de list1 . A diferencia de las otras tres dependencias anteriores, las NPM no intentarán instalar las dependencias de pares cuando realizan list2 . Esto se debe a que NPM espera que estas dependencias sean proporcionadas por otras dependencias .

Veremos por qué esto tiene sentido, pero debemos tomar un desvío muy corto para conocer cómo las dependencias de las estructuras de NPM están dentro de la carpeta .

Cómo las dependencias de las tiendas NPM

Vamos a hacer esto con un ejemplo:

Iniciaremos un paquete de NPM e instalaremos list4 como dependencia:

  list5  

Si nos fijamos en el directorio <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 36 ahora, podemos ver que tiene instalado el paquete <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 37 junto con list8 :

  list9  

Ahora, no hay 99887776640 carpeta dentro de list-159...1 carpeta A pesar de que tiene un 99887776642 :

  list-159...3  

y si lo k en el paquete list-159...4 del paquete , verá que requiere 99887776646 paquete con la versión list-159...7 :

  list-159...8  

SO list-159...9 Requiere list0 AT VERSIÓN list1 SO PUTÉNTO junto con list2 Para que lo use. < / p>

  list3 

Ahora vamos a ver qué sucede si queremos usar list4 en nuestra aplicación, pero en la versión list5 .

  list6  

NPM reemplazó la versión con list7 que queremos. Pero qué hay de las necesidades de list8 PAQUETE QUE QUIERE list9 AT <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 0 ? No se preocupe, NPM lo cuida dando <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 1 su propia copia local de <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 2 en <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 3 .

  <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body>   <p>     mary had a <a href="little">greedy</a> lamb     whose fleece was <a href="white">cold</a> as snow   </p> </body></html>';  $doc = new DOMDocument; $doc->loadhtml($string);  $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) {   $tn = $doc->createTextNode($a->getAttribute('href'));   $a->parentNode->replaceChild($tn, $a); }  echo $doc->savehtml(); 4 

Para que pueda ver que NPM agregó un <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 65 <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 66666666666666666666660 Así es como el NPM se asegura de que tanto nuestra aplicación, así como 99887776667 están satisfechos con sus propios requisitos. Pero hay una llave para llevar aquí:

"Si más de un paquete requiere otro paquete en común, pero en diferentes versiones, las NPM instalarán varias copias, para cada una de ellas para satisfacerlas".

Esto puede no ser siempre ideal en algunos casos. Digamos que nuestro paquete quiere usar <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 8 , pero no nos importa qué versión es siempre y cuando esté por encima de la versión <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 9 y estamos seguros de que algún otro paquete, como <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 0 también se utilizará junto con (que tiene su propio <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 1 en <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 2 ). En ese caso, es posible que no deseemos que las NPM instalen otra copia aumentando el volumen. En su lugar, podemos especificar <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 3 como A ... Peer Dependency !

ahora NPM no instalará la dependencia de pares automáticamente. Pero esperará que sea proporcionado por algún otro paquete.

Finalmente, llegando a su caso ...

En el caso de <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 4

:

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p>     mary had a little lamb     whose fleece was white as snow   </p></body> </html> 5  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 6 Se pretendía que se usara con <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 7 y 99887776678 Paquetes. No hay manera de usar <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body><p> mary had a little lamb whose fleece was white as snow </p></body> </html> 9 sin usar aquellos porque todas estas son parte de un paquete más grande typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 0 lo que le ayuda a lintingScript y el código JS. Por lo tanto, habrías instalado typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 1 de todos modos, y esa sería la única razón para usar typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 2 .

Por lo tanto, los autores lo vieron en forma para agregarlos como typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 3 no le importa, siempre y cuando tenga una versión menor de typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 4 en el typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 5 < / Código>, typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 6 O typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 7 Series. De manera similar, para typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 8 con la versión typedef struct { long nIndex; // 4 bytes on Windows TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode } structItems; 9 .


¡Uf! Eso fue todo un paseo, pero esperamos que esto respondiera tu pregunta! :)


Editar sección basada en comentarios:

Ahora supongo que bifurcé el complemento @ TypeScript-Eslint / Eslint-Eslint y desea que todos ERR Los mensajes mencionados en la pregunta desaparecen. Si agrego eslint y analizador a las dependencias del paquete bifurcado, las Peerdependencias se vuelven sin sentido. ¿Debo agregarlos a las devdependencias en su lugar?

Podría, pero eso hará que el <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 90 no tiene sentido. Lo que debe entender es que el archivo <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 91 es solo un manifiesto para instruir a NPM qué hacer cuando otra persona "instala" el paquete, ya sea en otro paquete como dependencia, o individualmente como un paquete global. Independientemente, el TCHAR2 es como un manual de instrucciones para NPM.

No te afecta, como desarrollador, de ninguna manera. Por lo tanto, si todo lo que desea hacer es agregar TCHAR3 y TCHAR4 para fines de desarrollo, simplemente podría hacer:

  TCHAR5  

El indicador TCHAR6 le dice a NPM que no agregue a la TCHAR7 , pero vuelva a buscar el paquete y colóquelo en <?php $string = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>...</title></head><body> <p> mary had a <a href="little">greedy</a> lamb whose fleece was <a href="white">cold</a> as snow </p> </body></html>'; $doc = new DOMDocument; $doc->loadhtml($string); $xpath = new DOMXPath($doc); foreach( $xpath->query('//a') as $a ) { $tn = $doc->createTextNode($a->getAttribute('href')); $a->parentNode->replaceChild($tn, $a); } echo $doc->savehtml(); 98 directorio Independientemente. Cuando esté ejecutando su aplicación, todo lo que hará es, consulte TCHAR9 para la presencia del paquete y no fieldtype00 . El propósito de fieldtype01 se realiza después del paso de instalación.

Hágame saber si esto aclara sus preguntas. Añadiré más si es necesario.

feliz año nuevo! :)

 

@Daniel_Knights answered the question mostly to the point. But I'd like to add my two cents too. So here goes:

Types of dependencies in NPM:

In order to understand this, it is important to understand the different types of dependencies in an NPM package. In general, there are 4 types of dependencies in NPM:

  1. direct dependency (or simply dependency): These are dependencies which are absolutely necessary for an NPM package to function. If you are building a web application with express.js, then you absolutely want the express to be installed for your application to boot up. So this would be a direct dependency for your application. These should be listed under the "dependencies": {} section of package.json.

  2. development dependency: These are dependencies which are helpful while developing your application but not necessarily used by the application package to run. An example of such a dependency would be typescript. NodeJS does not understand Typescript. So even though you could be writing your application in Typescript, after you run it through the typescript compiler, you are left with Javascript. So even though you need to add the typescript package during development, you don't need it for your application to run AFTER it's compiled.

So if you add typescript to your "devDependencies": {} section in package.json and do an npm install, NPM will install both dependencies and devDependencies. At this stage, you can invoke your Typescript compiler to build your application. But after that, you can run npm prune --production, and NPM will strip away all devDependencies from node_modules/. This reduces your final application bundle size and keeps it free of any dev dependencies.

You should not refer to any dev dependency inside your source code without allowing for your code to safely and gracefully fallback to alternatives since the package will be removed on pruning.

  1. optional dependency: These are dependencies you can specify inside the "optionalDependencies": {} section of package.json. When you are specifying a dependency as optional, you letting NPM know that "Your program will use this dependency if it is available. If it's not, that's cool too. It will use something else."

A common scenario where this can help is in using database drivers. Database drivers written in JS are not particularly efficient or performant. So it's common to use a driver with native bindings (a JS library using a native (C/C++) package to run its tasks). But the problem is that for native bindings, the native package must be installed in the machine where the app is being run. This may not always be available. So we can specify a native library as an optional one. You can refer to this in JS code like:

var pg = require('pg-native'); // Native binding library if (!pg) {                     // If it's not available...   pg = require('pg');          // ...use non native library. } 

So while installing packages using npm install, NPM will attempt to install an optional dependency too. But if it isn't able to install (probably because the native binding isn't available), it'll not error out. It'll just post a warning and move on.

And now to the type of dependency in question...

  1. peer dependency: As you already know, these are dependencies you specify inside the "peerDependencies": {} section of package.json. Unlike the other three dependencies above, NPM will not attempt to install peer dependencies when doing npm install. This is because NPM expects these dependencies to be provided by other dependencies.

We will see why this makes sense, but we must take a very short detour to learn about how NPM structures dependencies within node_modules/ folder.

How NPM stores dependencies

Let's do this with an example:

We'll init an npm package and install express as a dependency:

$ npm install express --save 

If we look at the node_modules/ directory now, we can see that it has the qs package installed along with express:

$ ls -l node_modules/ total 196 // ...more stuff... drwxr-xr-x 3 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 express <---------- here is our express drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 finalhandler drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 forwarded drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 fresh drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 http-errors drwxr-xr-x 4 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 iconv-lite drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 inherits drwxr-xr-x 3 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 ipaddr.js drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 media-typer drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 merge-descriptors drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 methods drwxr-xr-x 3 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 mime drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 mime-db drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 mime-types drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 ms drwxr-xr-x 3 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 negotiator drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 on-finished drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 parseurl drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 path-to-regexp drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 proxy-addr drwxr-xr-x 5 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 qs <---------- focus here for a bit drwxr-xr-x 2 rajshrimohanks rajshrimohanks 4096 Dec 31 16:00 range-parser // ...even more stuff ... 

Now, there is no node_modules/ folder within express/ folder even though it has a package.json:

$ ls -l node_modules/express/ total 132 -rw-r--r-- 1 rajshrimohanks rajshrimohanks 109589 Oct 26  1985 History.md -rw-r--r-- 1 rajshrimohanks rajshrimohanks   1249 Oct 26  1985 LICENSE -rw-r--r-- 1 rajshrimohanks rajshrimohanks   4607 Oct 26  1985 Readme.md -rw-r--r-- 1 rajshrimohanks rajshrimohanks    224 Oct 26  1985 index.js drwxr-xr-x 4 rajshrimohanks rajshrimohanks   4096 Dec 31 16:00 lib -rw-r--r-- 1 rajshrimohanks rajshrimohanks   3979 Dec 31 16:00 package.json 

And if you look at the package.json of the express package, you'll see that it requires qs package with version 6.7.0:

$ cat node_modules/express/package.json {   // other stuff ...    "dependencies": {     "accepts": "~1.3.7",     "array-flatten": "1.1.1",     "body-parser": "1.19.0",     "content-disposition": "0.5.3",     "content-type": "~1.0.4",     "cookie": "0.4.0",     "cookie-signature": "1.0.6",     "debug": "2.6.9",     "depd": "~1.1.2",     "encodeurl": "~1.0.2",     "escape-html": "~1.0.3",     "etag": "~1.8.1",     "finalhandler": "~1.1.2",     "fresh": "0.5.2",     "merge-descriptors": "1.0.1",     "methods": "~1.1.2",     "on-finished": "~2.3.0",     "parseurl": "~1.3.3",     "path-to-regexp": "0.1.7",     "proxy-addr": "~2.0.5",     "qs": "6.7.0", <-------------- this is what we are looking at     "range-parser": "~1.2.1",     "safe-buffer": "5.1.2",     "send": "0.17.1",     "serve-static": "1.14.1",     "setprototypeof": "1.1.1",     "statuses": "~1.5.0",     "type-is": "~1.6.18",     "utils-merge": "1.0.1",     "vary": "~1.1.2"   },    // ... more stuff ... } 

So express requires qs at version 6.7.0 so NPM put it alongside express for it to use.

$ cat node_modules/qs/package.json {   // ... stuff ...    "name": "qs",   "repository": {     "type": "git",     "url": "git+https://github.com/ljharb/qs.git"   },   "scripts": {     "coverage": "covert test",     "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js",     "lint": "eslint lib/*.js test/*.js",     "postlint": "editorconfig-tools check * lib/* test/*",     "prepublish": "safe-publish-latest && npm run dist",     "pretest": "npm run --silent readme && npm run --silent lint",     "readme": "evalmd README.md",     "test": "npm run --silent coverage",     "tests-only": "node test"   },   "version": "6.7.0" <---- this version } 

Now let's see what happens if we want to use qs in our application BUT at version 6.8.0.

$ npm install qs@6.8.0 --save npm WARN dep-test@1.0.0 No description npm WARN dep-test@1.0.0 No repository field.  + qs@6.8.0 added 2 packages from 1 contributor, updated 1 package and audited 52 packages in 0.796s found 0 vulnerabilities  $ cat node_modules/qs/package.json {   //... other stuff ...    "name": "qs",   "repository": {     "type": "git",     "url": "git+https://github.com/ljharb/qs.git"   },   "scripts": {     "coverage": "covert test",     "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js",     "lint": "eslint lib/*.js test/*.js",     "postlint": "eclint check * lib/* test/*",     "prepublish": "safe-publish-latest && npm run dist",     "pretest": "npm run --silent readme && npm run --silent lint",     "readme": "evalmd README.md",     "test": "npm run --silent coverage",     "tests-only": "node test"   },   "version": "6.8.0" <-------- the version changed! } 

NPM replaced the version with 6.8.0 which we want. But what about the needs of express package which wants qs at 6.7.0? Don't worry, NPM takes care of it by giving express its own local copy of qs at 6.7.0.

$ cat node_modules/express/node_modules/qs/package.json {   // ... other stuff ...    "name": "qs",   "repository": {     "type": "git",     "url": "git+https://github.com/ljharb/qs.git"   },   "scripts": {     "coverage": "covert test",     "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js",     "lint": "eslint lib/*.js test/*.js",     "postlint": "editorconfig-tools check * lib/* test/*",     "prepublish": "safe-publish-latest && npm run dist",     "pretest": "npm run --silent readme && npm run --silent lint",     "readme": "evalmd README.md",     "test": "npm run --silent coverage",     "tests-only": "node test"   },   "version": "6.7.0" <----- just what express wants! } 

So you can see that NPM added a local node_modules for express alone and gave its own version. This is how NPM makes sure that both our application as well as express are satisfied with their own requirements. But there is one key takeaway here:

"If more than one package require another package in common but at different versions, NPM will install multiple copies, for each one of them in order to satisfy them."

This may not be always ideal in some cases. Let's say our package wants to use qs but we don't care what version it is as long as it is above version 6.0.0 and we are sure that some other package, like express will also be used alongside (which has its own qs at 6.7.0). In that case, we may not want NPM to install another copy increasing the bulk. Instead we can specify qs as a...peer dependency!

Now NPM won't install the peer dependency automatically. But will expect it to be provided by some other package.

So finally, coming to your case...

In the case of @typescript-eslint/eslint-plugin:

{   "peerDependencies": {     "@typescript-eslint/parser": "^4.0.0",     "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"   },   "dependencies": {     "@typescript-eslint/experimental-utils": "4.11.1",     "@typescript-eslint/scope-manager": "4.11.1",     "debug": "^4.1.1",     "functional-red-black-tree": "^1.0.1",     "regexpp": "^3.0.0",     "semver": "^7.3.2",     "tsutils": "^3.17.1"   }, } 

@typescript-eslint/eslint-plugin was intended to be use with @typescript-eslint/parser and eslint packages. There is no way you would be using @typescript-eslint/eslint-plugin without using those because all these are part of a larger package eslint which helps you lint Typescript and JS code. So you'd have installed eslint anyways and that would be the only reason to use @typescript-eslint/eslint-plugin.

Hence, the authors saw it fit to add themn as @typescript-eslint/eslint-plugin doesn't care as long as you have any minor version of eslint in the 5.x.x, 6.x.x or 7.x.x series. Similarly for @typescript-eslint/eslint-parser with version 4.x.x.


Whew! That was quite a ride but hopefully this answered your question! :)


Edit based on comment:

Now assume that I forked the @typescript-eslint/eslint-plugin and want all ERR! messages mentioned in question disappear. If I add eslint and parser to dependencies of forked package, peerDependencies becomes meaningless. Should I add them to devDependencies instead?

You could, but that would make the devDependencies meaningless. What you must understand is that the package.json file is just a manifest to instruct NPM what to do when someone else "installs" the package - either in another package as a dependency, or individually as a global package. Regardless, the package.json is like an instruction manual for NPM.

It does not affect you, as a developer, in any way. So if all you want to do is add eslint and @typescript-eslint/eslint-parser for development purposes, you could simply do:

$ npm install --no-save eslint @typescript-eslint/eslint-parser 

The --no-save flag tells NPM not to add these to the package.json but fetch the package and put it in node_modules/ directory regardless. When you are running your app, all it will do is, look into node_modules/ for the package presence and NOT package.json. The purpose of package.json is done after the install step.

Let me know if this clarifies your questions. I'll add more if required.

Happy New Year! :)

 
 
       
       
3
 
vote

El campo peerDependencies está diseñado para su uso con bibliotecas / complementos como una forma de dejar que la aplicación de instalación se denomina qué dependencias se requieren para que funcione sin agregar un mayor a granel al paquete en el propio paquete > dependencies campo.

de la docs :

Como administrador de paquetes, una gran parte del trabajo de NPM al instalar sus dependencias está gestionando sus versiones. Pero su modelo habitual, con un hash de "dependencias" en Package.json, cae claramente para los complementos. La mayoría de los complementos nunca dependen en realidad de su paquete de host, es decir, los complementos de gruñidos nunca hacen require("grunt") , por lo que incluso si los complementos hicieron que su paquete de host como dependencia, la copia descargada nunca se utilizaría. Así que volveríamos a la cuadrícula, con su aplicación, posiblemente, enchufando el complemento a un paquete de host en el que es incompatible.

La idea es que instale el paquete en devDependencies para desarrollar el paquete y publicarlo sin esa dependencia, entonces cualquier aplicación que intente usar su paquete y no " T tiene que esta dependencia de pares instalada recibirá un error:

  npm ERR! peerinvalid The package flatiron does not satisfy its siblings' peerDependencies requirements! npm ERR! peerinvalid Peer flatiron-cli-config@0.1.3 wants flatiron@~0.1.9 npm ERR! peerinvalid Peer flatiron-cli-users@0.1.4 wants flatiron@~0.3.0   

El error que está recibiendo es simplemente decir que @typescript-eslint/eslint-plugin requiere que instale eslint6 para que funcione como debería.

Por lo tanto, la respuesta obvia es ejecutar npm i -D eslint para guardarlo como una dependencia. pero , este complemento es un subdirectorio del paquete typescript-eslint , y la posibilidad de que los contribuyentes se olvidaron de agregar eslint como un dev-dependency Parece poco probable, por lo que, es seguro asumir, no es necesario instalar para el desarrollo.

Sin saber cómo funciona internamente, diría que, como se requiere dependencies0 para usar dependencies11111111 , desarrollar cualquier complemento para el paquete principal requiere hacerlo a través de la paquete padre mismo.

Si se ve en la Guía de contribución , se menciona a desarrollarse desde el directorio raíz:

Desarrollo en este repositorio es fácil:

  • Primera horquilla el repo, y luego clonlo a nivel local.
  • Crea una nueva sucursal.
  • En la raíz del proyecto, ejecute la instalación de hilo.
  • Esto instalará las dependencias, vincule los paquetes y hará una compilación.
  • Hacer los cambios requeridos.

No soy un experto, así que tome esto con un grano de sal, pero, en lugar de trabajar directamente en el subdirectorio, creo que debe estar trabajando en el complemento de la raíz del proyecto en su lugar.

 

The peerDependencies field is intended for use with libraries/plugins as a way of letting the installing app known which dependencies are required for it to work without adding extra bulk to the package itself in the dependencies field.

From the docs:

As a package manager, a large part of npm's job when installing your dependencies is managing their versions. But its usual model, with a "dependencies" hash in package.json, clearly falls down for plugins. Most plugins never actually depend on their host package, i.e. grunt plugins never do require("grunt"), so even if plugins did put down their host package as a dependency, the downloaded copy would never be used. So we'd be back to square one, with your application possibly plugging in the plugin to a host package that it's incompatible with.

The idea is that you install the package in devDependencies for developing the package and publish it without that dependency, then any app which tries to use your package and doesn't have this peer-dependency installed will receive an error:

npm ERR! peerinvalid The package flatiron does not satisfy its siblings' peerDependencies requirements! npm ERR! peerinvalid Peer flatiron-cli-config@0.1.3 wants flatiron@~0.1.9 npm ERR! peerinvalid Peer flatiron-cli-users@0.1.4 wants flatiron@~0.3.0 

The error you're receiving is simply saying that @typescript-eslint/eslint-plugin requires you to install eslint for it to work as it should.

So, the obvious answer is to run npm i -D eslint to save it as a dev-dependency. But, this plugin is a sub-directory of the typescript-eslint package, and the chance that the contributors forgot to add eslint as a dev-dependency seems unlikely, so, it's safe to assume, it doesn't need to be installed for development.

Without knowing how it works internally, I'd say that, as typescript-eslint is required for using @typescript-eslint/eslint-plugin, developing any plugin for the parent package requires doing so through the parent package itself.

If you look in the contribution-guide, it mentions developing from the root-directory:

Developing in this repo is easy:

  • First fork the repo, and then clone it locally.
  • Create a new branch.
  • In the root of the project, run yarn install.
  • This will install the dependencies, link the packages and do a build.
  • Make the required changes.

I'm no expert, so take this with a grain of salt, but, rather than working directly in the sub-directory, I think you need to be working on the plugin from the root of the project instead.

 
 
 
 

Relacionados problema

4  Debe empaquetar.json ser bloqueado por servidor web (IIS)  ( Should package json be blocked by web server iis ) 
Si intento acceder a const button = document.querySelector('button') const stream = Rx.Observable.fromEvent(button, 'mousedown') const mouseUp$ = Rx.Observab...

2  ¿Cuál es la mejor manera de cambiar automáticamente entre versiones de nodos?  ( What is the best way to automatically switch between node versions ) 
Cuando trabaja con dos proyectos y un proyecto depende del nodo V 8 y otro proyecto depende del nodo v 10, debe cambiar de alguna manera entre ellos. No e...

6  Cómo usar Gitlab Repo en NPM con Package.Json  ( How to use gitlab repo in npm with package json ) 
Estoy trabajando en un proyecto interno y quiero compartir herramientas dentro del grupo. Pero si uso las herramientas NPM. Solicitar que el módulo se haya ...

69  ERROR: EAPM: OPERACIÓN NO PERMITIDA, DESLENADOR 'D: Sources ** node_modules fsevents node_modules abbrev Package.json'  ( Error eperm operation not permitted unlink d sources node modules fseven ) 
Acabo de actualizar npm a 5.4.0 . Ahora, siempre que quiero instalar un paquete NPM, obtenga el siguiente error: D:SourcesDownloadCmsMd.DownloadWeb.Ang...

0  Reactjs: ¿hay una manera de tener una versión "local" de Package.Json?  ( Reactjs is there a way to have a local version of package json ) 
Me gustaría tener varias versiones de marca de marca diferente de mi aplicación de reacción. Básicamente, quiero tener varias versiones de "demo", cada una co...

-1  El nodo no está funcionando. "ReferenceError: Requiere no está definido ..."  ( Node is no working referenceerror requiere is not defined ) 
Estoy tratando de hacer mi chat de FISRT con nodo y socket.io, pero tengo este error: > Foto de mi consola cuando usamos este código: var express = requ...

4  Cómo integrar una construcción personalizada de Lodash en un proyecto  ( How to integrate a lodash custom build into a project ) 
lodash admite compilaciones personalizadas con solo un subconjunto de la funcionalidad / tamaño. Crear una compilación personalizada es una brisa con lodas...

5  TS-NODE EJECUTE TIPSIPT CON MÓDULO DE IMPORTACIÓN Y MÓDULO DEFINIDO  ( Ts node execute typescript with module import and module defined ) 
Intento inicializar la base de la base de datos a través de TyperScript. MI TS es como: import { User, UserRole } from '../entity/User'; import crypto fr...

9  NPM Ejecutar la construcción siempre construye la producción y nunca el desarrollo  ( Npm run build always builds production and never development ) 
En un proyecto heredado que tengo, estoy tratando de obtener el comando de compilación para crear una versión que no sea Production . He intentado cambiar ...

26  Pase la línea de comandos Args a los scripts de NPM en Package.Json  ( Pass command line args to npm scripts in package json ) 
Tengo los siguientes scripts en mi paquete.json: "scripts": { "vumper": "node node_modules/vumper/index.js", "format": "prettier --single-quote -wi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos