代码之家  ›  专栏  ›  技术社区  ›  Sebastiandg7

使用共享资源的Windows Linux子系统(WSL)节点.jsWindows安装:节点.jsnpm&npx二进制文件不工作

  •  0
  • Sebastiandg7  · 技术社区  · 6 年前

    我最近搬到了Windows+WSL环境(顺便说一句,WSL运行得非常好)。这样做的主要原因是要有一个Linux环境进行开发,并让Windows用于其他应用程序和游戏,而无需重新启动我的计算机(以前有双启动设置)。

    在安装过程中,我发现大多数Windows安装的二进制文件都可以从WSL执行。因此,我不必重复安装(例如:在Windows中安装java和maven以使用Eclipse IDE,然后在WSL中分别安装以在终端中使用),而只需在Windows中安装java jdk,并将二进制文件符号链接到WSL以共享jdk安装,这是完美的。 但是对node执行相同的操作时,node npm和npx二进制文件不起作用:(

    nvm windows . 因此,我按照以下方式开始安装:

    在WSL中,我配置了 ,以下 Nick Janetakis guide here (谢谢 Nick / 而不是 /mnt公司/ :

    [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)。但是。。。

    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/npx它必须在WSL中找到文件的正确Windows路径?

    很抱歉问了这么长时间,但由于非常特殊的设置,我认为语境化是必要的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   PuiMan Cheui    5 年前

    有解决办法吗?我遇到过同样的情况,我希望在WSL和Windows之间共享相同的节点和npm,因为我希望同时在terminal(WSL)和IDEA(Windows)中运行它们。

    我发现npm不能通过drviers运行,就像在drviers下使用npm一样 C:/ F:/ ,导致错误:

    internal/modules/cjs/loader.js:638
        throw err;
        ^
    
    Error: Cannot find module 'C:\f\Users\aleen\AppData\Roaming\nvm\v10.21.0\node_modules\npm\bin\npm-cli.js'
        at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
        at Function.Module._load (internal/modules/cjs/loader.js:562:25)
        at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
        at startup (internal/bootstrap/node.js:283:19)
        at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
    

    但是,我们总是在一个驱动程序中工作,这意味着我们可以在常用的驱动程序下安装npm( 女:/ 对我来说),并创建一个别名以通过相对路径在驱动程序中运行它:

    # ~/.bash_aliases
    function npm() {
      $(realpath --relative-to="$(pwd)" /mnt/f/Program\ Files/nodejs)/npm $@
    }
    export -f npm
    
        2
  •  1
  •   Ben Smith    4 年前

    我无法在Windows10中使用Ubuntu20.04LTS在WSL中安装npm。

    但是当我按照指示 here 我确实设法让它工作了。注意,它说它是针对WSL2的,但是安装node的步骤在WSL1环境中是有效的(现在是7月20日,我仍然无法在我的windows10版本中获得WSL,啊!)。

    sudo apt-get install curl
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
    

    然后,您可以安装一个较新版本的node,默认情况下,它与npm一起提供。

    nvm install --lts
    
        3
  •  0
  •   Anselmo Park    6 年前

    但是,我建议您应该检查“programfiles”下的npm是否在WSL上运行良好。

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

    在我的例子中,运行上述命令时会发生另一个错误。

    Error: EINVAL: invalid argument, uv_pipe_open
    

    如果在您的环境中是相同的,您可以先解决这个问题。

    而且,关于模块路径问题,它似乎是由路径引起的;原始npm(在程序文件下)和您的符号链接有不同的当前路径。

    我修改了原始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将显示不同的结果,并导致模块路径问题。