ちょっとした小手先テクの話です。

自作のコマンドラインツールを作った場合、困るのが配置方法です。 例えば、以下のようなケースがあったとき、CLIで使いたいならPATHを通したくなるのだが、それだとどんどん増えちゃいますよね。

.
├── test.exe
└── lib.dll

こんな時に使えるテクニックがあって、それは「シェルスクリプトで代行する」です。 …というかNodeのやり方をパクってるだけなのですが。

例えば、~/.local/binにPATHを通しているなら、以下のようなコマンドと同名のシェルスクリプトを書いて、 .Cmdに対応するところにコマンドの絶対パスが入るとか、そういう感じにすれば良い。

これでシンボリックリンクの代わりになるようなファイルが作れます。

ちなみにこれの良い所は、実行主体はそのままなのでWindowsだとDLLの検知範囲に入るところ。これが実はシンボリックリンクだと、リンクを貼っている方のフォルダが実行フォルダと見做されるので、Windowsのルール上DLLの検知に入らないのです。なので、ダイナミックライブラリを一緒においた時、それも一緒にPATHの通っているところにシンボリックリンクを貼るなどしないといけない。

#!/bin/sh

exec "{{ .Cmd }}" "$@"

同じことはPowershellでも出来る。

#!/usr/bin/env pwsh

$exe = ""
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
  $exe = ".exe"
}
$ret = 0
if ($MyInvocation.ExpectingInput) {
  $input | & "{{ .Cmd }}$exe" $args
}
else {
  & "{{ .Cmd }}$exe" $args
}
$ret = $LASTEXITCODE

exit $ret

なので、自分はツール化してみた。…が、ちょっと今はとりあえず非公開。。

これで結構スッキリします。