package.jsonのversionをつかってGitHubのタグつけとリリースの追加をしようとしたらjqとxargsの組み合わせでハマったメモ

## 概要

xargsの知見が足りずに解決まで時間がかかってしまったのでメモしておく。
やりたかったことは、package.jsonのversionをつかってGitHubのタグつけとリリースの追加。

```json
 "add-github-releases":  "jq -r .version package.json  | tr -d '\\r\\n' |  xargs -i gh release create \"v{}\" --title \"v{}\" --notes-file './release-note-latest.md'"
```

[ソースコード](https://github.com/hibohiboo/async-ttrpg/tree/ac8e01aa92f8e3dd4562cef3952407ca1719336f)

## 環境
- Windows 11 Home `23H2 22631.4112`
- GitBash `git version 2.46.0.windows.1`

## 発生したエラーと解決の手順
### バージョンvが作られてしまう事態の発生
このときのコードは下記。

```
jq -r .version package.json  | xargs -i gh release create v{} --title v{} --notes-file './release-note-latest.md'
```

本来v0.1.0のタグが切られてほしいところがvになってしまう現象が発生。


### tag_name is not a valid tag

もしかして、と下記のように xargsのiオプションにより参照している{}を""で囲んだらエラーが変わった。(参照: [xargsのオプション](https://www.ibm.com/docs/ja/aix/7.3?topic=x-xargs-command))


```
jq -r .version package.json  | xargs -i gh release create \"v{}\" --title \"v{}\" --notes-file './release-note-latest.md'
```


```
HTTP 422: Validation Failed (https://api.github.com/repos/hibohiboo/async-ttrpg/releases)
tag_name is not a valid tag
tag_name is not well-formed
Published releases must have a valid tag
```

### echoの出力がおかしい
どんなコマンドがくみたてられているのか、echoで確認したら出力の様子がおかしい。

```
jq -r .version package.json  | xargs -i echo gh release create \"v{}\" --title \"v{}\" --notes-file './release-note-latest.md'
```

```
$ npm run add-github-releases

> async-ttrpg@0.1.2 add-github-releases
> jq -r .version package.json  | xargs -i echo gh release create "v{}" --title "v{}" --notes-file './release-note-latest.md'

 --notes-file ./release-note-latest.md
 ```
 
### null文字の疑惑？
xargsの0オプションで空文字をコマンドの区切りにしない設定としたら出力が変わった。改行文字が渡されていそう
```
jq -r .version package.json  | xargs -0 -i echo gh release create \"v{}\" --title \"v{}\" --notes-file './release-note-latest.md'
```

```
$ npm run add-github-releases

> async-ttrpg@0.1.2 add-github-releases
> jq -r .version package.json  | xargs -0 -i echo gh release create "v{}" --title "v{}" --notes-file './release-note-latest.md'

gh release create v0.1.2
 --title v0.1.2
 --notes-file ./release-note-latest.md
 ```

 ### tオプションで確認
 [xargsのオプション](https://www.ibm.com/docs/ja/aix/7.3?topic=x-xargs-command)にトレースモードなるものがあるので確認してみた。

```
jq -r .version package.json  | xargs -t -i echo gh release create \"v{}\" --title \"v{}\" --notes-file './release-note-latest.md'
```

`'v0.1.2'$'\r'`完全に改行文字がいますねコレ。

 ```
 $ npm run add-github-releases

> async-ttrpg@0.1.2 add-github-releases
> jq -r .version package.json  | xargs -t -i echo gh release create "v{}" --title "v{}" --notes-file './release-note-latest.md'

echo gh release create 'v0.1.2'$'\r' --title 'v0.1.2'$'\r' --notes-file ./release-note-latest.md
 --notes-file ./release-note-latest.md
 ```

 ### 改行文字を取り除く

 bash詳しくないので github copilotくんに聞いたらいろいろ教えてくれた。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/2d01ac8e-da35-e6cb-c963-cdca23218832.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/ad24f251-dc74-490c-e0bc-159e38a12258.png)

これでやりたいことができるようになった。

```
jq -r .version package.json  | tr -d '\\r\\n' |  xargs -i gh release create \"v{}\" --title \"v{}\" --notes-file './release-note-latest.md'
```