Cli: [问题]对全局软件包使用Powershell脚本的必要性

创建于 2019-11-11  ·  13评论  ·  资料来源: npm/cli

什么为什么


按照https://github.com/npm/read-cmd-shim/pull/6的说明,在安装全局软件包时会添加PowerShell脚本。 这会导致Windows上一些麻烦,需要添加安全标志来运行ps1脚本,否则会出现此错误

* * .ps1无法加载,因为此系统上禁用了运行脚本

以前,所有全局npm软件包都开箱即用,因为PowerShell会改用cmd脚本。 我预见到此添加将导致人们之间的许多混乱,尤其是在使用Windows(即PowerShell)上的Visual Studio Code内置终端的人们之间。

参考文献

https://github.com/microsoft/TypeScript/issues/35031
https://stackoverflow.com/questions/58796490/tsc-ps1-can-be-loaded-because-running-scripts-is-disabled-on-this-system
以下一些更新的答案甚至建议删除ps1文件。
https://stackoverflow.com/questions/57673913/vsc-powershell-after-npm-updating-packages-ps1-can-be-loaded-because-runnin

Needs Discussion Question

最有用的评论

删除npm bin目录中的所有*.ps1脚本吗?

所有13条评论

@Cerlancism。 在powershell中键入以下命令

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

要么

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned-范围LocalMachine

运行.ps1 PowerShell脚本后

@Cerlancism
https://github.com/npm/read-cmd-shim/pull/6中,我仅添加了Powershell支持的提取路径。
此功能适用于https://github.com/npm/cli/pull/281

如果您想知道为什么在安装软件包时添加* .ps,请参见: https :

当将管道输入传递给PowerShell脚本时, Node.js进程( https://github.com/npm/cmd-shim/pull/43 )的内置脚本。剧本。

刚在最新的机器上安装了最新的NPM,这在开箱即用的情况下非常令人讨厌。

只要您可以在计算机上执行任何操作, @ RAJU2529提供的解决方案就可以了。 在加入域的计算机上,即使用户是计算机的管理员,此设置也可以由组织设置来驱动,并且不能被覆盖。
除了降级NPM版本以外,还有其他解决方法吗?

删除npm bin目录中的所有*.ps1脚本吗?

@ ExE-Boss这就是我现在结束的工作,但这确实是一种解决方法...

也同意以上内容。 比更改执行策略更好...我知道它可以正常运行,并且所有人都可能正在运行脚本,但是...完全是愚蠢的

我们最近将构建服务器更新为最新的节点LTS。
我们的某些PowerShell脚本使用如下代码:

Start-Process "npm-cli-login" [...] -NoNewWindow

如果您询问powershell它使用哪个可执行文件( (Get-Command npm-cli-login).Source ),则会得到新创建的ps1- Files而不是cmd

该过程以%1 is not a valid win32 application退出,因为ps1-脚本不是有效的可执行文件。

这是一个版本中的重大更改,至少应进行审查。

删除npm bin目录中的所有*.ps1脚本吗?

我们是否有办法强制Windows在使用npm linknpm i -g ../<package>不创建.ps1脚本? 必须一直在npm文件夹上并始终清除此混乱情况,这令人感到沮丧。

如果您的系统具有命令提示符,一种快速的解决方法是告诉PowerShell使用cmd版本: <package-name>.cmd

例如对于TypeScript:
代替
tsc -v现在在PowerShell中调用tsc.ps1
采用
tsc.cmd -v

如果您的系统具有命令提示符,一种快速的解决方法是告诉PowerShell使用cmd版本: <package-name>.cmd

是的,如果添加.cmd powershell使用正确的可执行文件。

但是,如果您拥有版本化的构建脚本,而该版本在发行后不应更改,则只有两种可能性:

  • 仍要更改
  • 不要更新节点->可能的安全问题。

添加了此功能的请求请求34将其作为npm问题20699的修复程序。 检查该问题,似乎核心问题是在Windows命令行上将&字符作为命令参数传递。 这被解释为命令分隔符,因此会出错。

image

但是,在Windows命令行中,我们可以使用尖号转义&字符。 ^&

image

远射,但这对于引入这些重大变化的实施方案是否可行? 有什么方法可以检测到将参数指定给Windows命令行和正则表达式,还是将插入号字符注入到参数中以进行转义? 像@ ExE-Boss老板这样的人是否知道我们是否有某些原因无法使用类似方法解决此问题?

以下文档介绍了处理Windows命令行参数解析的最佳方法。 用它作为指导吗?
https://docs.microsoft.com/zh-CN/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way

我认为管道也无法使用与此相关的ps1脚本。

我正在尝试使用以下常用工具:
prettyjson
更漂亮

例如,当我在Powershell上运行以下命令时:
echo '{"a": 1}' | prettyjson

终端将一直等待输入,直到按下CTRL + C并退出,并且没有预期的输出。

解决方法是将.cmd到命令中,或仅使用cmd代替:
echo '{"a": 1}' | prettyjson.cmd

产出

a: 1

我对stackoverflow的问题: https :

更新资料

对不起,我只是回顾了它在这里评论之前https://github.com/npm/cli/issues/470#issuecomment -568165144有关标准输入管道和PR在这里https://github.com/npm/cmd-shim / pull / 43 。 但是,仍然可以使用.cmd来处理管道。

此页面是否有帮助?
0 / 5 - 0 等级