我有以下脚本,名为
Minimal.ps1
:
Add-Type -LiteralPath "$PSScriptRoot/lib/JsonPatch.Net.dll"
$ErrorActionPreference = "Stop"
[System.Text.Json.JsonSerializer]::Deserialize[Json.Patch.JsonPatch]("[]")
在我拥有的
lib
目录中,从JsonPatch.Net 3.2.3 Nuget包中提取了
lib/net8.0/
的内容。
在 Windows (pwsh 7.4) 上,该脚本有效:
$ pwsh ./Minimal.ps1
Operations
----------
{}
当我尝试在 Linux 上的 docker 中运行相同的脚本时,它失败了:
$ docker run --rm -it -v .:/test -w /test mcr.microsoft.com/dotnet/sdk:8.0.404 /usr/bin/pwsh ./Minimal.ps1
MethodInvocationException: /test/Minimal.ps1:6
Line |
6 | [System.Text.Json.JsonSerializer]::Deserialize[Json.Patch.JsonPatch]( …
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "Deserialize" with "1" argument(s): "Could not resolve type 'Json.Patch.PatchJsonConverter' in assembly 'JsonPatch.Net, Version=3.0.0.0, Culture=neutral,
| PublicKeyToken=17ed63f672b0e278'."
我尝试显式创建
PatchJsonConverter
的实例,但它返回了相同的错误(无法解析类型)。
我看到
JsonPatch.Net
依赖于 Json.More.Net
、JsonPointer.Net
、Humanizer.Net
。
当尝试使用
Add-Type
在 Linux 上加载这些 dll 时,我会收到这样的错误,除了正确加载的 Humanizer.Net
之外。
Add-Type -Verbose -LiteralPath "$PSScriptRoot/lib/Json.More.dll"
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Could not load file or assembly 'Json.More, Version=2.0.0.0, Culture=neutral, PublicKeyToken=17ed63f672b0e278'.
经过一些测试,问题似乎发生在
mcr.microsoft.com/dotnet/sdk:8.0.404
映像(以及我测试的所有其他 dotnet 8 映像)中安装的 PowerShell 版本上。确切的 PowerShell 版本是 7.4.6。
我不确定问题的发生是否是由于 PowerShell 版本或其在映像中的安装方式所致,但在 dotnet 9 映像中或在 Debian bookworm 容器中手动安装 PowerShell 时,一切都按预期工作。