SYM's Tech Knowledge Index & Creation Records

「INPUT:OUTPUT=1:1以上」を掲げ構築する Tech Knowledge Stack and Index. by SYM@孤軍奮闘する IT Engineer.

Golang ビルド制約使用時の golps に関する注意事項

Golang ビルド制約使用時の golps に関する注意事項

前置き

プラットフォーム毎の処理を実装するときは、runtime.GOOS での判定は NG、 ビルド制約を使うのが吉

Golang はどのようにクロスプラットフォームの開発とテストを簡素化するのか

vscode + gopls で ビルド制約 を扱う

gopls では、ビルドタグを、2 つ以上同時には設定できない。

1 つしか設定できない= linux,windows 等複数プラットフォームに対する個別処理を実装する際には、随時 buildFlags を切り替えるしかなさそう。

ref: x/tools/gopls: improve handling for build tags #29202

なので、ワークスペースの設定ファイル作り、以下のように、buildFlags を windows, linux 切り替える shell 等 を用意して1コマンドで切り替えられるようにすれば、多少手間は省けるかと。

※ただし、ビルド制約を使用しているソースに関しては、例えば buildFlags を windows にしている時は それ以外のプラットフォーム用のソースで 警告かエラーが必ず出てしまう。 (そこに関しては妥協するしかないのだろうか…)

VSCODE_SETTINGS=".vscode/settings.json"
TAGS_WIN="\"-tags=windows\""
TAGS_LINUX="\"-tags=linux\""
REGEX_WIN=".*${TAGS_WIN}.*"
REGEX_LINUX=".*${TAGS_LINUX}.*"

build_flag_line=`grep "build.buildFlags" ${VSCODE_SETTINGS}`

if [[ ${build_flag_line} =~ ${REGEX_WIN} ]]; then
    echo "chage windows to linux"
    sed -i -e "s/${TAGS_WIN}/${TAGS_LINUX}/g" ${VSCODE_SETTINGS}
elif [[ ${build_flag_line} =~ ${REGEX_LINUX} ]]; then
    echo "change linux to windows"
    sed -i -e "s/${TAGS_LINUX}/${TAGS_WIN}/g" ${VSCODE_SETTINGS}
else
    echo "no change"
fi

cat ${VSCODE_SETTINGS}