Подсистема Windows для Linux (WSL) с использованием общей установки Node.js с Windows: Node.js Двоичные файлы npm & npx не работают - PullRequest
0 голосов
/ 04 января 2019

Я недавно перешел в среду Windows + WSL (кстати, WSL идет очень хорошо).Основная причина для этого состоит в том, чтобы иметь среду разработки Linux и иметь Windows для других приложений и игр без перезагрузки компьютера (ранее была настроена двойная загрузка).

В процессе установки янайдено, что большинство установленных двоичных файлов Windows могут быть выполнены из WSL.Таким образом, вместо дублирования установок (например, установка java и maven в Windows для использования Eclipse IDE, а затем установка его в WSL отдельно для использования его в терминале), я мог бы просто установить java jdk в Windows и символически связать двоичные файлы с WSL по порядкучтобы поделиться установкой JDK, это работало без нареканий). Но, делая то же самое с узлом, случается, что двоичные файлы узла npm и npx не работают: (

Я хотел иметь установку с одним узлом, которой я мог бы управлять, используя nvm windows. Поэтому я запустил установку следующим образом:

В WSL я настроил свой / etc / wsl.conf , следуя Руководство Ника Ника Джанетакиса (спасибо Ник ) за монтирование дисков Windows на / вместо / mnt / :

/ etc / wsl.conf

[automount]
root = /
options = "metadata"

Затем установил узел в windows:

C:\Windows\system32> nvm install 10.15.0
... installing process...
C:\Windows\system32> nvm use 10.15.0
...success message...
C:\Windows\system32> node -v
v10.15.0
C:\Windows\system32> npm -v
6.4.1

Пока все работает как надо. Следующий шаг - это символическая ссылка на двоичные файлы узла Windows на WSL. Эти двоичные файлы расположены по адресу:

C:\Windows\system32> where node
C:\Program Files\nodejs\node.exe

C:\Windows\system32> where npm
C:\Program Files\nodejs\npm
C:\Program Files\nodejs\npm.cmd

C:\Windows\system32>where npx
C:\Program Files\nodejs\npx
C:\Program Files\nodejs\npx.cmd

Итак, внутри терминала WSL (помните, что мои диски монтируются в / c, а не / mnt / c в качестве поведения по умолчанию):

user@host:~$ mkdir ~/bin
user@host:~$ ln -s /c/Program\ Files/nodejs/node.exe ~/bin/node
user@host:~$ ln -s /c/Program\ Files/nodejs/npm ~/bin/npm
user@host:~$ ln -s /c/Program\ Files/nodejs/npx ~/bin/npx

И ...

user@host:/d/tmp$ node -v
v10.15.0
user@host:/d/tmp$ echo "console.log('Hello World');" >> index.js
user@host:/d/tmp$ node index.js
Hello World

Отлично! ( Примечание: , так как узел установлен в Windows, когда вы находитесь на WSL, вы должны использовать его внутри дисковода, / d в этом cаза).Но ...

user@host:~$ npm -v
internal/modules/cjs/loader.js:583
throw err;
^

Error: Cannot find module 'C:\home\user\bin\node_modules\npm\bin\npm-cli.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
at Function.Module._load (internal/modules/cjs/loader.js:507:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)

Вот почему я пишу это.Ошибка ясна, npm пытается найти npm-cli.js в пути, который представляет собой проводную смесь местоположения символической ссылки npm внутри пути Windows.

Есть ли способ сообщить npm / npx правильныйПуть в Windows, где он должен найти свои файлы из WSL?

Извините за длинный вопрос, но из-за особой настройки я посчитал эту контекстуализацию необходимой.

1 Ответ

0 голосов
/ 04 января 2019

У меня есть своя собственная среда разработки, поэтому я не смог протестировать ее в той же вашей среде.Но я предлагаю вам проверить, хорошо ли работает npm в разделе «Program Files» на WSL.

user@host:~$ /c/Program\ Files/nodejs/npm -v

В моем случае при запуске над командой возникает другая ошибка.

Error: EINVAL: invalid argument, uv_pipe_open

Если в вашей среде то же самое, вы можете сначала решить эту проблему.

И, что касается проблемы с модулем, похоже, она вызвана путем;исходный npm (в разделе Program Files) и ваша символическая ссылка имеют разный текущий путь.

Я изменил исходный npm, как показано ниже:

#!/bin/sh
(set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix

basedir=`dirname "$0"`

echo $basedir  # Added code

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
...

Если вы запустите исходный npm и вашу символическую ссылку, $ basedir будет показывать разные результаты, и это вызывает проблему с модулем.

Если вы можете решить первую проблему (ошибка uv_pipe_open), как насчет добавления каталога nodejs на ваш путь вместо символических ссылок?

...