01. 基礎

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 で
指定し分けたもの。この差は下の「期間の指定」で数値を並べて見る。

ソース

hello.tjp
/*
 * 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
}

学ぶ内容

期間の指定 — effort / duration / length

この段階で唯一、絶対に取り違えてはいけないところ。
以降の段階で出てくる日付はすべてこの3つのどれかで決まっており、
ここを誤解したまま進むと「なぜこの日付になるのか」が最後まで追えなくなる。

3つは「何を宣言しているか」が違う。期間はその結果として決まる。

指定 宣言しているもの 担当 期間の決まり方
effort 仕事の量 (人日) 必須 担当の空き時間から逆算される
duration 暦の長さ 任意 宣言どおり。土日・祝日も消費する
length 稼働日の長さ 任意 宣言どおり。土日・祝日は数えない

同じ 10d を3通りで指定した結果

依存を張っていないので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

allocate が期間を変えるのは effort のときだけ

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 で書くと、
担当を増やしても稼働時間を変えても計画がまったく反応しなくなる。

ハマりどころ

  1. 人が手を動かす作業は effort で書く。duration / length は期間を先に
    決めてしまうので、増員や稼働率の変更に計画が反応しない
  2. effort を書いたタスクに allocate が無いとエラーで止まる。
    担当を決めずに枠だけ取りたいなら duration か length を使う
  3. duration / length に allocate を足しても期間は変わらない。
    変わるのは担当の負荷 (工数) だけ
  4. depends の ! は「親を起点」、つまり兄弟タスクを指す。
    階層をまたぐパスの書き方は 02 で扱う
  5. now はレポートの「今日」の位置。ここでは表示上の基準線だが、
    06 で実績を入れると計画そのものに効いてくる

得られるもの

tjp を書いて tj3 に通し、結果を確認するというサイクルが回せるようになる。
effort と duration の使い分けは以降すべての段階で前提になるので、
ここで数字の差を見て納得しておくと後が楽。