如何使用 Windows PowerShell PackageManager (OneGet) 安装 Node.js?

Posted

技术标签:

【中文标题】如何使用 Windows PowerShell PackageManager (OneGet) 安装 Node.js?【英文标题】:How to install Node.js with Windows PowerShell PackageManager (OneGet)? 【发布时间】:2019-02-18 02:02:14 【问题描述】:

我试过Install-Package nodejs,好像做了点什么:

PS C:\WINDOWS\system32> Install-Package nodejs

The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'chocolatey'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): y

Name                           Version          Source           Summary
----                           -------          ------           -------
nodejs.install                 11.10.0          chocolatey       Node JS - Evented I/O for v8 javascript.
nodejs                         11.10.0          chocolatey       Node JS - Evented I/O for v8 JavaScript.

然后当我尝试运行node 命令时,它失败了:

PS C:\WINDOWS\system32> node
node : The term 'node' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ node
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (node:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

如何正确使用PackageManager,以便该命令可用?

不确定其他问题是否相关:Chocolaty packages not installing via OneGet/PackageManagement in Windows 10?

正如另一个问题所暗示的,我尝试设置Set-ExecutionPolicy Unrestricted,卸载并重新安装nodejs,但结果是一样的。

我确实看到安装后存在以下文件:

C:\Chocolatey\lib\nodejs.11.10.0\nodejs.11.10.0.nupkg
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg\legal\LICENSE.txt
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg\legal\VERIFICATION.txt
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg\tools\chocolateyInstall.ps1
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg\tools\node-v11.10.0-x64.msi
C:\Chocolatey\lib\nodejs.install.11.10.0.nupkg\nodejs.install.11.10.0.nupkg\tools\node-v11.10.0-x86.msi

这让我觉得它可能希望我在之后手动运行安装程序?

我的目标是通过脚本在新的 Windows 机器上简单地安装我需要的任何东西,而无需使用 GUI 手动下载/安装它们。

【问题讨论】:

有什么理由不直接下载官方的可执行文件吗?另外,您是否尝试过使用“nodejs”别名而不是“node”? @MadWard 我想使用脚本在新的 Windows 系统上安装我需要的一切。我只是厌倦了手动下载文件,然后手动运行 GUI 来安装所有东西。它很慢。所以现在我正在设置一台新的 Windows 机器,我想写一个脚本,以便下次它会变得轻而易举(就像我已经为 Linux 和 macOS 编写的那样)。我想我可以使用新的内置 PackageManager 来做到这一点,但如果这被证明太难了,那么我会选择 choco,如果这样更容易的话,但我想先尝试一个内置的解决方案。 为什么不直接wget官方的.msi,比如nodejs.org/dist/v10.15.1/node-v10.15.1-x64.msi,用msiexec安装? @EricWong 好吧,我虽然 Install-Package nodejs 应该很容易,这就是原因。我最终切换到choco 并安装了东西。如果我可以有一个命令来安装每个包,我不想为每个包编写不同的安装说明。 【参考方案1】:

我能够重现此问题,但也能够解决它。问题是使用Install-Package 安装后,node 可执行文件不在 PATH 上。但是,这确实有一定的意义,因为当前的 PowerShell 进程在重新启动之前不会接收外部对环境变量的更改。

Chocolatey 的 refreshenv 命令有时会起作用,但并非总是如此,并且在使用 Install-Package 安装 nodejs 后,refreshenv 无法刷新 PATH 变量。 所做的 工作是启动一个新的 PowerShell 会话并运行 node 命令,它成功地运行了可执行文件:

> node

Welcome to Node.js v16.7.0.
Type ".help" for more information.
> 

choco.exe 有时可以掩盖这一点,但通常 Chocolatey 不会为 EXE 或 MSI 安装程序放置的可执行文件生成 shim(除非包维护者强制创建它们)。

提示:如果您需要从安装软件包的同一进程调用二进制文件(例如,在 chef-client 运行期间 refreshenv 不是选项),使用可执行文件的完全限定路径来调用新安装的软件。


此外,不要在真正的自动化中使用 Chocolatey OneGet 提供程序;它还不稳定,在撰写本文时看起来像hasn't seen any development activity in five years。来自README.md

注意:寻求维护者帮助完成此提供程序。请在问题列表或 Gitter 上查询(请参阅下面的聊天室)。谢谢!

在同一README中列出了一个替代方案:

注意:目前,在此提供程序准备好之前,您可能对使用 ChocolateyGet 提供程序作为权宜之计更感兴趣。详情见https://github.com/jianyunt/ChocolateyGet

我试过这个,它似乎可以工作,但我仍然建议使用官方的choco.exe 二进制文件。它易于安装,使用时您将获得最好的支持。这也说明配置管理解决方案(例如 Chef 的 chocolatey_package 资源)继续使用二进制文件,并且通常会将安装客户端列为先决条件,尽管从技术上讲 PackageManagement 模块可以用作本机解决方案.

【讨论】:

以上是关于如何使用 Windows PowerShell PackageManager (OneGet) 安装 Node.js?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Powershell 创建 Windows 集群

如何使用 Windows Azure PowerShell

如何使用python和powershell向Windows 10添加用户

如何从 PowerShell 命令行查找 Windows 版本

如何使用PowerShell管理Windows服务

如何信任 Windows Powershell 中的证书