Entry

プログラミングメモ - プロジェクトのディレクトリ構造について

2009年05月31日

小さなプログラムを作る場合は,あまり気にすることはないんですけれど,ある程度の規模のプログラムを作るようになると,ソースコードを適切に管理する必要が出てきます。ちゃんと整理しとかないと,ごちゃごちゃになる。

で,これは趣味の方の話なんですけれど,ここ数ヶ月,自分のプロジェクトをどうやって整理しようか,ずっと考えていたのでした。で,今のところこんな感じで落ち着いている。

bin ........... 出力される実行モジュール
build ......... 主にビルドに使うファイル(Makefile, *.dsw, *dsp など)
etc ........... 実行モジュールの設定ファイルとか
ext ........... 外部モジュールのルート
include ....... ライブラリのプロジェクトの場合の公開ヘッダ
lib ........... 出力されるライブラリモジュール
man ........... マニュアルなど
src ........... 実装ファイル(c, cpp など),ローカルヘッダ
test .......... テストプロジェクトのルート

以前はかなり複雑に作ってたんですけど,管理するときのオーバーヘッドが大きくなっちゃったので,少しずつ変更。プロジェクト名をルートにして,フラットなディレクトリ構成で作っています。例えば,プロジェクト名が FooBar だったら,FooBart/bin みたいな感じで作っていくわけ。

ポイントは,ext/ や test/ のような外部モジュールへのルートディレクトリを設けているところ(大した話じゃないけれど)。例えば,FooBar プロジェクトが Baz モジュールを使っている場合は,FooBar/ext/Baz/... みたいに置く。このとき Baz/ 以下は,上のディレクトリ構成と同じ構成で作ります。ただし,ext/ 以下に導入するモジュールは,上のモジュールに対してのみローカルなモジュールとする,といったルールを作っておきます。上の例で言うと,Baz モジュールは FooBar モジュールより上のプロジェクトに対する外部モジュールということです。これで,モジュールを木構造で管理できる。

で,ま,こゆ構造を手で作るのも面倒くさいので,最近はバッチやシェルスクリプトで作るようにしています。これも大した話じゃないんだけど。例えば,バッチの場合は,こんなのを作ってる。

@echo off

setlocal
set PROJECT_NAME=%1

set PROJECT_DIR=.
set PROJECT_ROOT=%PROJECT_DIR%\%PROJECT_NAME%

set BIN_DIR=bin
set LIB_DIR=lib
set SRC_DIR=src
set MAN_DIR=man
set EXT_DIR=ext
set ETC_DIR=etc
set TEST_DIR=test
set BUILD_DIR=build
set INCLUDE_DIR=include

rem ------------------------------------------------------------

set ERROR_MESSAGE=

if "%PROJECT_NAME%" neq "" goto :argument_ok
set ERROR_MESSAGE=project name is not given.
goto :error
:argument_ok

if not exist %PROJECT_ROOT% goto :directory_ok
set ERROR_MESSAGE=%PROJECT_ROOT% : directory exists.
goto :error
:directory_ok

mkdir %PROJECT_ROOT%
cd %PROJECT_ROOT%
if "%BIN_DIR%"     neq "" mkdir %BIN_DIR%
if "%LIB_DIR%"     neq "" mkdir %LIB_DIR%
if "%SRC_DIR%"     neq "" mkdir %SRC_DIR%
if "%MAN_DIR%"     neq "" mkdir %MAN_DIR%
if "%EXT_DIR%"     neq "" mkdir %EXT_DIR%
if "%ETC_DIR%"     neq "" mkdir %ETC_DIR%
if "%TEST_DIR%"    neq "" mkdir %TEST_DIR%
if "%BUILD_DIR%"   neq "" mkdir %BUILD_DIR%
if "%INCLUDE_DIR%" neq "" mkdir %INCLUDE_DIR%
goto :done

:error
echo %ERROR_MESSAGE%
goto :end

:done
echo done.
goto :end

:end

endlocal

進め方としては,まず本体のプロジェクトを作って,それからテストプロジェクトを test/ 以下に作ります。VC のような IDE を使う場合は,そこからテストプロジェクトを開いて,本体のプロジェクトをインポート(この時点で本体は空っぽ)。テストケースを書きながら本体をを実装します(TDD ってやつか)。で,本体ができたら,他のモジュールと組み合わせて結合テスト……みたいな感じ。この頃は,この方法がなんとなく板についてきた感じです。

使う言語によって必要なディレクトリは変わってくるだろうけど,おおむねこの方法で楽に管理できるんじゃないかなー……と。ま,ただそれだけ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN