◆ install-package や find-package
  ◆ PowerShell7 だとデフォルトで NuGet からインストールできる
◆ find-package はすごく遅い
  ◆ ワイルドカードをつけたほうが速くなる

インストール

install-package yamldotnet

みたいな感じです

find-package からパイプしてる例をよく見ます

find-package yamldotnet | install-package

NuGet からの取得だとパッケージプロバイダーのインストールとかパッケージソースの登録とか必要と書かれてるのも見ますが PowerShell7 だとデフォルトで NuGet は登録済みでした

PS C:\Users\WDAGUtilityAccount> get-packageprovider

Name Version DynamicOptions
---- ------- --------------
NuGet 3.0.0.1 Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag, …
PowerShellGet 2.2.5.0 PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, In…

PS C:\Users\WDAGUtilityAccount> get-packagesource

Name ProviderName IsTrusted Location
---- ------------ --------- --------
nuget.org NuGet False https://api.nuget.org/v3/index.json
PSGallery PowerShellGet False https://www.powershellgallery.com/api/v2

Source

パッケージによっては PSGallery と nuget.org の両方で見つかるのでそういうときは -source をつけて指定します

PS C:\Users\WDAGUtilityAccount> find-package "newtonsoft.json"

Name Version Source Summary
---- ------- ------ -------
newtonsoft.json 1.0.2.201 PSGallery Serialize/Deserialize Json using Newtonsoft.json
Newtonsoft.Json 13.0.3 nuget.org Json.NET is a popular high-performance JSON framework…

PS C:\Users\WDAGUtilityAccount> find-package "newtonsoft.json" -source nuget.org

Name Version Source Summary
---- ------- ------ -------
Newtonsoft.Json 13.0.3 nuget.org Json.NET is a popular high-performance JSON framework…

インストール先

NuGet パッケージのインストール先はここでした

C:\Program Files\PackageManagement\NuGet\Packages

場所は -Destination の指定で変更可能です

find-package "yamldotnet" -source nuget.org | install-package -destination .

こうすると今のフォルダにパッケージのフォルダ (YamlDotNet.13.7.1) が作られます

一応 PSGallery の方もインストールしてみると ユーザーフォルダ内にインストールされました

C:\Users\WDAGUtilityAccount\Documents\PowerShell\Modules

遅い

このコマンド すごく遅いです
分単位で待たされます
遅いのだと 10 分以上かかってたりです

何が遅いのかとタスクマネージャーを見てたりしたのですが CPU 負荷やディスク負荷はほぼなしでした
ネットワークの受信が 24kbps くらいのすごい低速で長時間行われていたので通信速度の問題の気がします
ただ Github などから重めのファイルをダウンロードするときは 100MB でも 2, 3 秒で終わります
PowerShell のパッケージの通信のみが遅いです

ワイルドカードにすると速い

find-package コマンドを使うとき ワイルドカードで探すこともできます

find-package "newtonsoft.json*"

こうするとかなり高速になります
2, 3 秒程度で結果が表示されます

ワイルドカードを使ったときだけ 下の方にサーバーから結果取得中とあるので ワイルドカードの有無で検索方法が異なってるみたいです
ワイルドカードがあるとサーバーで検索して結果を受け取るようですが この場合は高速です
ワイルドカードを使わないときはとても遅いです
ローカルで検索してそうですが そもそものデータがローカルになさそうなので 一旦全部のパッケージデータを取得してからローカルで検索していて 全パッケージの取得が遅いとかでしょうか
たしかに 2 回目以降の検索は少し速くなってます

これがあるので完全な名前がわかっていてもワイルドカードで検索したほうが速いです
ただ余計なものもヒットしてしまうので インストールにパイプするなら where でフィルタが必要になります

PS C:\Users\WDAGUtilityAccount> find-package "newtonsoft.json*" -source nuget.org

Name Version Source Summary
---- ------- ------ -------
Newtonsoft.Json 13.0.3 nuget.org Json.NET is a popular high-performance JSON framework…
Newtonsoft.Json.Bson 1.0.2 nuget.org Json.NET BSON adds support for reading and writing BS…
Newtonsoft.Json.Schema 3.0.15 nuget.org Json.NET Schema is a complete and easy-to-use JSON Sc…
Newtonsoft.Json.FSharp 3.2.2 nuget.org Different serializers for Newtonsoft.Json, making it …
Newtonsoft.Json.Encryption 2.2.0 nuget.org Package Description
Newtonsoft.JsonResult 1.0.5778.10762 nuget.org A JsonResult ActionResult for ASP.NET MVC that uses t…
Newtonsoft.Json.Glimpse 1.0.2 nuget.org Debug JSON on the server with the Json.NET plugin for…
Newtonsoft.Json.Interface 2.2.3 nuget.org The Json.NET Interface Converter/Mapper is a JsonConv…
Newtonsoft.Json.Akshay 5.0.4 nuget.org My package description.
Newtonsoft.Json.Legacy 3.5.9 nuget.org Json.NET is a popular high-performance JSON framework…

PS C:\Users\WDAGUtilityAccount> find-package "newtonsoft.json*" -source nuget.org | where { $_.name -eq "newtonsoft.json" }

Name Version Source Summary
---- ------- ------ -------
Newtonsoft.Json 13.0.3 nuget.org Json.NET is a popular high-performance JSON framework…

インストールもインストールでかなり遅いのですけどね
数 MB ~ 数十 MB のパッケージなのに毎秒 3KB くらいの速度だと終わる気がしないです
YamlDotNet はたしか 10 分くらいでしたが Newtonsoft.Json はそれ以上かかっても終わらないです
放置しておいたら依存関係のループが検出されましたってエラーで終了してました
でもこのパッケージって依存するパッケージがないんですよね
実際にループを検出してるんじゃなくて時間がかかりすぎたらこのエラーを出してそうです

仕方ないのでウェブからダウンロードしました
NuGet のサイトから簡単にダウンロードできます
こっちは高速
https://www.nuget.org/packages/Newtonsoft.Json

そういえば 使い方を調べてるとき NuGet のパッケージソースの URL を API v3 じゃなくて API v2 を指定したほうがいいみたいのを見た覚えがあります
動いてるしと深く気にせず次に行ってしまいましたが この問題の回避のためだったのかもしれないです

Newtonsoft.Json

ちなみに Newtonsoft.Json の dll は PowerShell7 に含まれてるのでインストールしなくても使えました
場所はここです

C:\Program Files\PowerShell\7\Newtonsoft.Json.dll

使用例
PS C:\Users\WDAGUtilityAccount> $json = '[{"name":"a"},{"name":"b"}]'
PS C:\Users\WDAGUtilityAccount> $data = [Newtonsoft.Json.JsonConvert]::DeserializeObject($json)
PS C:\Users\WDAGUtilityAccount> foreach ($item in $data) {
>> echo $item["name"].value
>> }
a
b
PS C:\Users\WDAGUtilityAccount> $data.gettype().assembly

GAC Version Location
--- ------- --------
False v4.0.30319 C:\Program Files\PowerShell\7\Newtonsoft.Json.dll

Linux

Linux (AlmaLinux 9) でも試してみました

(PowerShell のインストール方法)
dnf install https://packages.microsoft.com/config/rhel/9/packages-microsoft-prod.rpm
dnf install powershell

パッケージの検索が遅いのは相変わらずでした
ワイルドカードを使うと速くなります
やっぱり OS 起因とかじゃなくて 通信速度が異常に遅いことが原因みたいです

インストール先はここでした

/usr/local/share/PackageManagement/NuGet/Packages/

lib とかじゃなく share に入るようです
一般ユーザー権限だとエラーになるのですが 「-Scope CurrentUser」 オプションをつければホームフォルダの

.local/share/PackageManagement/NuGet/Packages

にインストールされるようです
エラーメッセージで説明されてました