01. 基礎
TaskJuggler の最小構成。プロジェクトを宣言し、人を定義し、タスクを並べ、HTML レポートを出すまでの一往復を通す。
あわせて、期間の指定方法 (effort / duration / length) を同じ 10d で並べて
比較できるようにしてある。ここが以降すべての段階の土台になる。
TaskJuggler の最小構成。プロジェクトを宣言し、人を定義し、タスクを並べ、HTML レポートを出すまでの一往復を通す。
あわせて、期間の指定方法 (effort / duration / length) を同じ 10d で並べて
比較できるようにしてある。ここが以降すべての段階の土台になる。
| ファイル | 内容 |
|---|---|
overview.html |
タスクの一覧とガントチャート |
前半は依存でつないだ3タスク。
| タスク | 開始 | 終了 | 指定 |
|---|---|---|---|
| 設計 | 2026-08-03 | 2026-08-07 | effort 5d + Alice |
| 実装 | 2026-08-10 | 2026-08-21 | effort 10d + Bob |
| レビュー | 2026-08-21 | 2026-08-24 | duration 3d (担当なし) |
実装が 08-10 始まりなのは、設計の完了 (08-07 金) を待って翌営業日から始まるため。
レビューは duration 指定なので担当者が不要で、暦の3日で終わる。
後半の「比較:」で始まる3タスクは、同じ 10d を effort / duration / length で
指定し分けたもの。この差は下の「期間の指定」で数値を並べて見る。
/*
* TaskJuggler 最小サンプル
*
* 実行: bundle exec tj3 -o 01-hello/out 01-hello/hello.tjp
*/
// project <ID> "名前" <開始日> <期間 or 終了日> { ... }
project hello "Hello TaskJuggler" 2026-08-03 +2m {
timezone "Asia/Tokyo"
timeformat "%Y-%m-%d"
// "今日" の位置。進捗の基準線になる
now 2026-07-29
}
// リソース (人・設備)
resource alice "Alice"
resource bob "Bob"
// 下の比較タスク専用。design / impl とリソースを取り合わせないために分けてある
resource carol "Carol"
// タスク
task design "設計" {
// effort = 人的工数。担当者が割り当たって初めて期間が決まる
effort 5d
allocate alice
}
task impl "実装" {
// ! は「同じ階層の兄弟」を指す。design が終わってから開始
depends !design
effort 10d
allocate bob
}
task review "レビュー" {
depends !impl
// duration = 担当者に関係なく経過時間で決まる期間 (暦日)
duration 3d
}
/*
* 期間指定の3通りを、同じ 10d で比べる。
*
* depends を張っていないので3本とも 08-03 (月) から並列に走る。
* 違いは「10d を何として解釈するか」だけ。
*/
task cmp_effort "比較: effort 10d" {
// 工数。担当の空き時間から期間が決まる → 10 営業日ぶん
effort 10d
allocate carol
}
task cmp_duration "比較: duration 10d" {
// 暦時間。8/8・8/9 の土日も消費するので、上より1日早く終わる
duration 10d
}
task cmp_length "比較: length 10d" {
// 稼働日。土日を数えないので effort と同じ終わり方になる。
// 差が出るのは担当を増やしたとき (effort だけ縮む)
length 10d
}
// レポート定義: 出力ファイル名 (拡張子は formats が付ける)
// 出力先ディレクトリは tj3 の -o オプションで指定する
taskreport overview "overview" {
formats html
headline "Hello TaskJuggler - 全体像"
columns name, start, end, effort, chart
}
project — ID / 名前 / 開始日 / 期間 (+2m のような相対指定)timezone / timeformat / now — 時刻の扱いと表示形式resource / task — 人とタスクの宣言effort — 人的工数。担当者が割り当たって初めて期間が決まるduration — 暦時間ベースの期間。担当者に依存しないlength — 稼働日ベースの期間。休日は数えないが担当者の負荷には依存しないallocate — タスクへの担当割当depends — 依存による直列化 (! は兄弟タスクを指す)taskreport — HTML レポートの出力この段階で唯一、絶対に取り違えてはいけないところ。
以降の段階で出てくる日付はすべてこの3つのどれかで決まっており、
ここを誤解したまま進むと「なぜこの日付になるのか」が最後まで追えなくなる。
3つは「何を宣言しているか」が違う。期間はその結果として決まる。
| 指定 | 宣言しているもの | 担当 | 期間の決まり方 |
|---|---|---|---|
effort |
仕事の量 (人日) | 必須 | 担当の空き時間から逆算される |
duration |
暦の長さ | 任意 | 宣言どおり。土日・祝日も消費する |
length |
稼働日の長さ | 任意 | 宣言どおり。土日・祝日は数えない |
依存を張っていないので3本とも 08-03 (月) から並列に走り、違いは指定方法だけ。
| 指定 | 開始 | 終了 | 工数 |
|---|---|---|---|
effort 10d + Carol |
2026-08-03 | 2026-08-14 | 10.0 |
duration 10d |
2026-08-03 | 2026-08-13 | 0.0 |
length 10d |
2026-08-03 | 2026-08-14 | 0.0 |
duration だけ 1 日早く終わる。8/8・8/9 の土日も「経過した」と数えるためeffort と length は担当が1人なら同じ結果になる。effort だけが縮み length は動かないduration / length はallocate は「誰がやるか」の指定だが、スケジュールへの効き方は指定方法で変わる。
| 組み合わせ | 結果 |
|---|---|
effort + allocate |
担当の空きから期間が決まる |
effort のみ |
エラーで停止 (Task x has an effort but no resource allocations.) |
duration / length + allocate |
期間は変わらない。その期間ぶん担当が拘束され工数が乗る |
duration / length のみ |
期間だけ確保。工数は 0 |
duration 10d に担当を付けると、終了は 08-13 のままで工数だけ 8.0 になる
(暦 10 日のうち稼働日は 8 日ぶん)。length 10d なら 10.0 (実測)。
どちらも期間は動かない。
| 何を表現したいか | 指定 |
|---|---|
| 人が手を動かす作業。増員や稼働率を計画に反映させたい | effort |
| 外部レビュー・検査・輸送などの待ち時間 | duration |
| 「営業日で n 日ぶんの枠」だけ確保したい (担当の負荷は見ない) | length |
迷ったら effort を選ぶ。人の作業を duration で書くと、
担当を増やしても稼働時間を変えても計画がまったく反応しなくなる。
effort で書く。duration / length は期間を先にeffort を書いたタスクに allocate が無いとエラーで止まる。duration か length を使うduration / length に allocate を足しても期間は変わらない。depends の ! は「親を起点」、つまり兄弟タスクを指す。now はレポートの「今日」の位置。ここでは表示上の基準線だが、tjp を書いて tj3 に通し、結果を確認するというサイクルが回せるようになる。
effort と duration の使い分けは以降すべての段階で前提になるので、
ここで数字の差を見て納得しておくと後が楽。