コーディング課題で本物の pom.xml、requirements.txt、package.json、go.mod を使う

本物の requirements.txt、pom.xml、package.json で学んだ生徒は、どの職場でもどのオープンソースプロジェクトでも出会うものを学んだことになります。そこでコーディング課題では、パッケージをまさにその方法で宣言します。言語のツールが読むファイルを、課題のファイルツリーの最上位に置くだけで、ほかに入力するものはありません。

同じファイルは生徒のパソコンでもそのまま使えます。プラットフォームから持ち出したプロジェクトも、Git から読み込んだプロジェクトも、パッケージを当社独自の形式に書き直すことなく動き続けます。

言語ごとのファイル

Python は requirements.txt か pyproject.toml を、ノートブックは requirements.txt を読みます。Java は pom.xml、Go は go.mod、Node の JavaScript と TypeScript は package.json を読みます。ファイルはツリーの最上位に「パッケージ」の印が付いて置かれ、新しい課題には書き換えるための小さな例が入っています。

Bash、SQL、C、C++、C#、Haskell、OCaml、R、Ruby、PHP、Rust、Kotlin、Prolog にはパッケージファイルがありません。これらの実行にはパッケージマネージャーが使えるネットワークがなく、必要なものはすでにインストールされています。

  1. 課題をエディターで開く. パッケージファイルはファイルツリーの最上位に「パッケージ」の印付きであります。
  2. パッケージを書く. 自分のパソコンと同じように、それぞれ正確なバージョンを付けて書きます。>=2.0 や ^4.18 のような範囲指定は受け付けられません。実行ごとに変わるバージョンでは採点の基準にならないからです。
  3. または手元のファイルを取り込む. ツリーの最上位にアップロードするか、そこにその名前のファイルを作ると、課題のパッケージリストになります。
  4. 「実行」を押す. プログラムが始まる前にパッケージがインストールされます。最初の実行は時間がかかり、2回目以降は取得済みのものを使います。

パッケージのインストール方法

パッケージは別のコンテナーで取得され、読み取り専用で実行に渡されます。実行そのものにはネットワークがありません。そのため生徒のプログラムは実行中に何もダウンロードできず、同じパッケージを宣言した課題は取得済みのものを使い回します。

各言語のパッケージは、広く使われているものを集めた承認済みリストから選ばれます。照合はそれぞれのエコシステムの名前の付け方に合わせ、Python と npm はパッケージ名、Java は公開元のグループ、Go はモジュールのパスで行います。リストにないパッケージは実行前に拒否され、メッセージにその名前が表示されます。授業に必要なパッケージがない場合は、「サポート」ページからお知らせください。

パッケージファイルは最大64 KB で、課題のほかのファイルと同じです。package-lock.json や poetry.lock のようなロックファイルは読まれません。インストールされるのはパッケージファイルに書かれた正確なバージョンです。

Java と Maven

pom.xml は、Maven が依存関係を読むのと同じように読まれます。プロパティ、依存関係の管理、親 pom と BOM のインポート、スコープに対応し、JUnit のような test スコープのパッケージはテストのときだけ使われます。パッケージは Maven Central から取得します。Gradle のビルドファイルは読まれないので、pom.xml を使ってください。

pom.xml に対応する前に作られた Java の課題は、以前の dependencies.xml をそのまま使えます。pom に移すには、pom.xml の全体を貼り付けるか、名前を pom.xml に変えてください。

Python、Node、Go

Python の課題のパッケージファイルは一度に1つです。requirements.txt から pyproject.toml に切り替えるには、ファイル名を変えます。pyproject.toml は [project] の dependencies か、Poetry の依存関係のテーブルが読まれます。

package.json は dependencies が読まれ、テストの実行時には devDependencies も読まれます。JavaScript のプロジェクトでは、テストだけが使うものをそこに置くからです。インストールスクリプトが実行されることはありません。

go.mod は require と、モジュールをプロジェクト内のフォルダーに向ける replace が読まれます。そのため課題を、独自のパッケージを持つ Go モジュールにできます。

リストを変更できる人

生徒はいつでもパッケージファイルを見られます。それを読むこともプロジェクトを理解することの一部だからです。変更できるかどうかは課題の設定で決まります。許可されていれば、生徒は自分のパソコンと同じように自分のコピーにパッケージを追加でき、次の実行でインストールされます。

よくある質問

生徒が自分でパッケージをインストールできますか?
パッケージファイルのある課題で、課題がその変更を許可していればできます。自分のパソコンと同じようにファイルにパッケージを書き足すと、次の実行でインストールされます。
プログラムが実行中にパッケージをダウンロードできますか?
いいえ。実行にはネットワークがありません。パッケージは事前に別のコンテナーで、承認済みリストから取得されます。
Gradle に対応していますか?
いいえ。Java の課題は pom.xml を読みます。
なぜバージョンを正確に書く必要があるのですか?
クラスの生徒全員と採点が、同じパッケージで実行されるようにするためです。範囲指定では、その日にいちばん新しいものがインストールされてしまいます。