Cli: [質問]グローバルパッケージに対するPowershellスクリプトサポートの必要性

作成日 2019年11月11日  ·  13コメント  ·  ソース: npm/cli

何/なぜ


https://github.com/npm/read-cmd-shim/pull/6に従って、グローバルパッケージをインストールするときにPowerShellスクリプトを追加します。 これにより、Windowsでps1スクリプトを実行するためにセキュリティフラグを追加する必要があります。そうしないと、このエラーが発生します。

* *。このシステムでは実行中のスクリプトが無効になっているため、.ps1をロードできません

以前は、PowerShellが代わりにcmdスクリプトを使用するため、すべてのグローバルnpmパッケージはすぐに実行されていました。 この追加により、人々、特にWindows上のVisual StudioCodeの組み込みターミナルであるPowerShellを使用している人々の間で多くの混乱が生じると予想しています。

参考文献

https://github.com/microsoft/TypeScript/issues/35031
https://stackoverflow.com/questions/58796490/tsc-ps1-cannot-be-loaded-because-running-scripts-is-disabled-on-this-system
そして、以下のいくつかの新しい答えは、ps1ファイルを削除することを提案しています。
https://stackoverflow.com/questions/57673913/vsc-powershell-after-npm-updating-packages-ps1-cannot-be-loaded-because-runnin

Needs Discussion Question

最も参考になるコメント

npm binディレクトリ内のすべての*.ps1スクリプトを削除しますか?

全てのコメント13件

@Cerlancism。 PowerShellで次のコマンドを入力します

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

または

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine

.ps1PowerShellスクリプトを実行した後

@Cerlancism
https://github.com/npm/read-cmd-shim/pull/6では、PowerShellサポートからの抽出パスのみを追加しています。
この関数はhttps://github.com/npm/cli/pull/281用です

パッケージのインストール時に* .psが追加される理由を知りたい場合は、 httpsください。

PowerShellスクリプトは、パイプライン入力がに渡されたときにstdinをNode.jsプロセス( https://github.com/npm/cmd-shim/pull/43 )にパイプする組み込みの方法を提供する唯一のスクリプトでもあり

最新のNPMを新しいマシンにインストールしたばかりですが、これは、箱から出してすぐに機能していたときは非常に厄介な動作です。

@ RAJU2529が提供するソリューションは、マシン上でやりたいことが何でもできる限り問題ありません。 ドメインに参加しているマシンでは、この設定は組織の設定によって駆動でき、ユーザーがマシンの管理者であっても上書きできません。
NPMバージョンのダウングレードを除いて、誰か別の回避策がありますか?

npm binディレクトリ内のすべての*.ps1スクリプトを削除しますか?

@ ExE-ボスは私が今のところやったことですが、それは本当に回避策です...

上記にも同意します。 実行ポリシーを変更するよりも優れています...それが機能し、すべての人がスクリプトを実行している可能性が高いことはわかっていますが...完全にばかげています

最近、ビルドサーバーをノードの最新のLTSに更新しました。
PowerShellスクリプトの一部は次のようなコードを使用します。

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

PowerShellに使用する実行可能ファイル( (Get-Command npm-cli-login).Source )を尋ねると、 cmdの代わりに新しく作成されたps1 -

ps1-scriptは有効な実行可能ファイルではないため、プロセスは%1 is not a valid win32 application終了します。

これはバージョン内の重大な変更であり、少なくとも確認する必要があります。

npm binディレクトリ内のすべての*.ps1スクリプトを削除しますか?

npm linkまたはnpm i -g ../<package>使用中にWindowsに.ps1スクリプトを作成させないようにする方法はありますか? npmフォルダーに移動して、この混乱を常にクリーンアップする必要があるのは、ちょっとイライラします。

システムにコマンドプロンプトがある場合の簡単な回避策の1つは、代わりにcmdバージョンを使用するようにPowerShellに指示することです。 <package-name>.cmd

たとえば、TypeScriptの場合:
の代わりに
tsc -vこれはPowerShellでtsc.ps1を呼び出すようになりました
使用する
tsc.cmd -v

システムにコマンドプロンプトがある場合の簡単な回避策の1つは、代わりにcmdバージョンを使用するようにPowerShellに指示することです。 <package-name>.cmd

はい、 .cmd追加すると、PowerShellは正しい実行可能ファイルを使用します。

ただし、リリース後に変更されるべきではないバージョン管理されたビルドスクリプトがある場合、2つの可能性しかありません。

  • とにかくそれを変更します
  • ノードを更新しない->セキュリティ上の問題の可能性。

この機能を追加したプルリクエスト34は、npm問題20699の修正として参照しています。 その問題を確認すると、コアの問題は、Windowsコマンドラインでコマンド引数としてアンパサンド文字を渡すことであるようです。 これはコマンド区切り文字として解釈されるため、エラーが発生します。

image

ただし、Windowsコマンドラインでは、キャレットを使用してアンパサンド文字をエスケープできます。 ^&

image

ロングショットですが、これは、これらの重大な変更を導入した実装されたものに対する実行可能な代替ソリューションである可能性がありますか? 引数がWindowsコマンドライン宛てで正規表現されていることを検出したり、キャレット文字をエスケープとして引数に挿入したりする方法はありますか? @ ExE-Bossのボスのような人は、似たようなものを使用してこの問題に対処できなかった理由があるかどうかを知っていますか?

次のドキュメントでは、Windowsコマンドライン引数の解析を処理するための最良の方法について説明します。 ガイドとして使用しますか?
https://docs.microsoft.com/en-us/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の前にstdinパイピングについてコメントされており、PRはhttps://github.com/npm/cmd-shimにあります.cmdとパイプで機能するようです。

このページは役に立ちましたか?
0 / 5 - 0 評価