mkht / pspm

PowerShell Package Manager
MIT License
13 stars 1 forks source link

-Saveでpackage.jsonを保存すると一部記号がエスケープされてしまう #52

Closed mkht closed 6 years ago

mkht commented 6 years ago

例えばこういうpackage.jsonがあるとして

{
  "dependencies": {
    "foo": "<0.1.0"
  }
}

これにpspm install bar -Saveなどのpackage.jsonに対する更新が走る処理をすると、

{
  "dependencies": {
    "foo": "\u003c0.1.0"
  }
}

のように一部記号がUnicodeエスケープされてしまう。 エスケープされていても動作上は問題ないが、可読性が著しく低下するのでツライ

mkht commented 6 years ago

具体的にエスケープされる記号は<, >, ', & の4種類(たぶん)

PowerShellのConvertTo-Jsonの動作仕様によるもので、 内部処理に使用しているJson.NETのJsonSerializerSettings.StringEscapeHandlingEscapeHtmlでハードコードされていると思われる。 https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_StringEscapeHandling.htm

mkht commented 6 years ago

現象が発生するのはPowerShell 5.1以前の環境のみ。 PowerShell 6.0ではConvertTo-Jsonの動作仕様が変更されているためエスケープは発生しない

https://github.com/PowerShell/PowerShell/blob/dfa11d7f5e8aed4e840f343f98513cd3231e7701/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/ConvertToJsonCommand.cs#L128

mkht commented 6 years ago

対処としてはPowerShell 6.0のConvertTo-Jsonをバックポートするか、一度エスケープされた記号をエスケープ解除する処理を挟むか

mkht commented 6 years ago

既存のインデント調整用コマンドFormat-Jsonの中にエスケープ解除する処理を追加した