main
パッケージが複数あるときのコンパイルでワイルドカード(*
)を使った指定をしたときに問題が起きたので、その対策方法メモです。
ついでにMakefileも作ります。
事前準備としてコマンドプロンプトでlinuxコマンドを使えるようにしておきます。
まぁWindowsでGO開発する人がいれば自然としているはず。
開発環境
パッケージを分けるほど大規模なプロジェクトは作っていないので、フォルダを分けてその中にmainパッケージのファイルを複数作っています。
以下のようなフォルダ構造です。
1 2 3 4 5 6 7 |
go - mypkg - projects - bin - project1 - project1.go (package main) - func1.go (package main) |
現象
mainパッケージが複数ある場合、すべてをコンパイル対象にする必要があります。
1 2 |
project1 > go run *.go GetFileAttributesEx *.go: The filename, directory name, or volume label syntax is incorrect. |
linuxならこれで通るんですが、エラーになってしまいます。
windowsのファイル情報取得部分で失敗しているみたいですね。
ちなみに全ファイルをべた書きするとコンパイルは通ります。
1 |
project1 > go run project1.go func1.go |
対策
べた書きで通るならべた書き風に出力するという安直な発想。
1 |
ls *.go | xargs go run |
ls *.go
の返値をgo run
のパラメータに入れてます。
windowsで起きた問題をlinuxコマンドで解決しているのに凄い違和感。
まあ問題なく通るんですが普通にMakefile作ったほうが楽な気もする。
Makefile
Windowsでmake
するにはなにかしらを入れる必要があります。
Make for windowsをインストールしてパスを通すのが楽です。
簡易シェルとしてしか使わないので最低限書いてみる。
1 2 3 4 5 6 7 |
BIN_DIR := ../bin MAKE_DIR_NAME := $(notdir $(abspath .)) TARGETS := $(shell ls '*.go') run: go run $(TARGETS) build: go build -o $(BIN_DIR)/$(MAKE_DIR_NAME) $(TARGETS) |
先ほどのようにls
コマンドの結果を変数(TARGETS
)に入れていますが、テストプログラムが混入しないようにべた書きしてもいいと思います。
プロジェクトの親フォルダにbinを置いているので、そこにプロジェクト名と同じ実行ファイルを作る設定にしています。