2015-02-25 1 views
6

Wenn ich die Entwicklung der npm Paket foo und ich möchte es weltweit als Kommandozeilen-Anwendung installiert werden, kann ich dies, indem zu meinem package.json einfach tun:Warum öffnet das globale npm-verknüpfte Paket einfach die bin-Datei?

"bin": { 
    "foo": "./bin/foo.js" 
} 

Jemand, der meine installiert package global via npm wird die entsprechende Batch-Datei und das Shell-Skript zu ihrem globalen npm-Präfix-Verzeichnis hinzugefügt. Angenommen, ich möchte mein Paket über die Shell (oder im Fall von Windows die Eingabeaufforderung) starten können. Ich könnte dies tun, indem ich irgendwo in einem meiner PATH-Verzeichnisse ein Batchdatei-/Shell-Skript erstelle, das mein Paket einfach direkt ausführt, z. @node C:\my\package\directory\bin\foo %*.

Dies ist eine ziemlich einfache und offensichtliche Lösung, aber ich fühlte, dass npm link war besser geeignet, da es weniger hacky fühlt und ist theoretisch so genau dies zu tun. Ich führe npm link in meinem Paketverzeichnis aus, dann teste es, indem ich foo von der Befehlszeile aus führe. Anstatt mein Skript auszuführen, wird foo.js tatsächlich in meinem Standardeditor geöffnet. Die Untersuchung im Präfix Verzeichnis, stellt sich heraus, dass die foo.cmd-Datei (der Inhalt des foo Shell-Skript ähnlich sind), dass erstellt npm enthält diese:

"%~dp0\node_modules\foo\bin\foo.js" %* 

mit der Batch-Datei von npm install -g erstellt Vergleichen:

@IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe" "%~dp0\node_modules\npm\bin\npm-cli.js" %* 
) ELSE (
    @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    node "%~dp0\node_modules\npm\bin\npm-cli.js" %* 
) 

Warum erstellt npm link Skriptdateien, die die bin-Datei eines Pakets starten, statt den Knoten mit der bin-Datei als Argument zu starten? Wie kann ich dieses Verhalten beheben?

+0

irgendeine Lösung dafür? – kingPuppy

Antwort

0

In welcher Version von npm laufen Sie? Das letzte ist 2.6.0, es gab vor kurzem eine Menge Verbesserungen bei npm - besonders bei Konflikten und Race Conditions während der Installation. Können Sie versuchen, Ihre npm-Installation zu aktualisieren?

aktualisieren npm auf Windows, folgen Sie den Anweisungen hier: https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows

+0

Laut "npm --version", ich 2.6.1 laufen. Ich habe keine Ahnung, wie das möglich ist, da das Paket [https://www.npmjs.com/package/npm] ziemlich klar angibt, dass das neueste 2.6.0 ist. – Hydrothermal

+0

Es sieht so aus, als hättest du 'npm @ next' installiert, was die Vorabversion von' npm' ist. Die '.cmd' Dateien, die' npm' erzeugen, werden mit dem 'cmd-shim' Paket erstellt. Wenn Sie sehen möchten, wie das funktioniert, können Sie einen Blick auf https://github.com/ForbesLindesay/cmd-shim werfen Es klingt, als ob Sie eine Feature-Anfrage für die 'npm' oder' cmd-shim' haben Projekt; Ich glaube nicht, dass es derzeit möglich ist, 'npm' machen zu lassen, was du willst. –

+0

Danke für die Info! Ich erinnere mich daran, 'npm @ next' installiert zu haben, um ein anderes Problem zu lösen, das ich hatte, also glaube ich, dass du recht damit hast. – Hydrothermal

5

Die Lösung #!/usr/bin/env node am Anfang Ihres bin Skript hinzuzufügen ist. Ich habe keine Ahnung warum. Ich habe es herausgefunden, indem ich mein Skript mit anderen verglichen habe, die funktionierten.