PowerShell でパッケージをインストールする
◆ install-package や find-package
◆ PowerShell7 だとデフォルトで NuGet からインストールできる
◆ 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
にインストールされるようです
エラーメッセージで説明されてました