はじめに

先日 Stack version 1.6.5 がリリースされました。

バグフィックスのみです。

いくつか前回の 1.6.3 に含まれていた内容が 1.6.5 に移動してますね。

更新方法

$ stack upgrade

$ stack --version
Version 1.6.5, Git revision 24ab0d6ff07f28276e082c3ce74dfdeb1a2ca9e9 (5514 commits) x86_64 hpack-0.20.0

バグフィックス

  • Windows でプリコンパイルされたキャッシュファイルのパス名が長過ぎる場合にビルドが失敗する問題を修正しました (#3649)

僕は Windows ユーザではないので、どのぐらいこのバグが深刻なのかわかりません。

stack の内部的には pathTooLong が新しく定義され、以前まではただの length で比較していたところを utf16StringLength の比較に修正したようです。


  • スクリプトインタプリタ形式で暗黙的に渡されるファイル引数を他の引数より先に処理するようにしました (#3658)。この修正により、スクリプト実行時に -- +RTS ... -RTS を渡せるようになりました。

以下のような RTS オプションの指定が適切に処理できるようになりました。


  • stack 設定ファイルで year パラメータが設定できるようになりました。それに伴い、ドキュメントもわかりやすくしました。 (#2275)。

こんな感じで指定できるようです。

ドキュメントを見る限り copyright を省略した場合は author-nameyear を使って copyright が生成されるようです。

また year を省略した場合は現在の年が設定されるとのことなので、設定しなくても良さそうですね。


  • ベンチーマークが別のベンチマークやビルドステップと並行して実行されてしまう問題を修正しました。これは別のプロセスのCPU利用がベンチマークに悪影響を及ぼすと思われるので理想的ではありません。また、デフォルトでベンチマークの出力が表示されないようになっていた件も同様に修正しました (#3663)

Never run benchmarks concurrently, always output to console #3663 #3666が修正のPRです。

良くわかりませんが Actiontype 型に ConcurrencyDisallowed というデータコンストラクタを追加し bench が呼ばれた際はこの値を Action 型の actionConcurrency フィールドに設定することで処理を切り替えるようにしているっぽいです。


  • パッケージのコンポーネントごとに別々のビルドキャッシュを持つことによって、未変更のファイルについて不要なリビルドを回避するようになりました (#3732)

issue にあがっている具体例だと foobar の2つのパッケージを作り、barfoo に依存しているという関係です。

$ stack test --no-run-tests
$ stack test --no-run-tests bar

この時、1回目でテストが終わってるので2回目で bar を指定した時に何も起こらないはずです。

しかし、実際にはこうなります。

$ stack test --no-run-tests bar
bar-0.1.0.0: unregistering (missing dependencies: foo)
foo-0.1.0.0: unregistering (local file changes: app/Main.hs test/Spec.hs)
foo-0.1.0.0: build (lib + exe)
foo-0.1.0.0: copy/register
bar-0.1.0.0: configure (lib + exe + test)

Use a separate build cache for each component of a package #3750で修正されています。

実装を見る感じ、コンポーネントというのは lib, exe, test, bench のことで、それぞれを接頭辞にしたビルドキャッシュを持つようになったみたい?です。


  • スナップショットからローカルパッケージにパッケージを反映させる処理の動作を修正しました。これはスナップショットのバージョン境界が衝突する時に発生する問題なので、古いパッケージの Hackage リビジョンによって引き起こされます。同様にカスタムスナップショットでも、問題の起きないパッケージの衝突するバージョンが定義できるようになりました。(Stackage issue #3185)

Fix package promotion to snapshot #3758 で修正されました。コードの差分は以下の1行です。

このようにローカルパッケージ反映時?にバージョンチェックを行わないようになりました。

以下のようにカスタムスナップショットに追加する場合はビルドできます。(async-2.1.1.1 には stm >= 2.2 && < 2.5 の依存関係が設定されています。async.cabal)

実行結果。

$ stack build --stack-yaml as-snapshot.yaml
WARNING: Ignoring out of range dependency (trusting snapshot over Hackage revisions): stm-2.1.2.2. async requires: >=2.2 && <2.5

...

Process exited with code: ExitFailure 1
    Logs have been written to: /home/bm12/Desktop/testProj/test/.stack-work/logs/async-2.1.1.1.log

    Configuring async-2.1.1.1...
    Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2: Encountered missing dependencies:
    stm >=2.2 && <2.5 && ==2.1.2.2

また、以下のように extra-deps に追加する場合はビルドが実行される前にバージョンエラーになります。

実行結果

$ stack build --stack-yaml as-extra-dep.yaml

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for async-2.1.1.1:
    stm-2.1.2.2 from stack configuration does not match >=2.2 && <2.5  (latest matching version is 2.4.5.0)
needed due to test-0.1.0.0 -> async-2.1.1.1

Some different approaches to resolving this:

  * Set 'allow-newer: true' to ignore all version constraints and build anyway.

  * Consider trying 'stack solver', which uses the cabal-install solver to attempt to find some working build configuration. This can be convenient when
    dealing with many complicated constraint errors, but results may be unpredictable.

  * Recommended action: try adding the following to your extra-deps in /home/bm12/Desktop/testProj/test/as-extra-dep.yaml:

- stm-2.4.5.0

Plan construction failed.

  • stack ghci で複数のパッケージで定義されている同名のモジュールを読み込めるようになりました (#3776)。

あんまりわかってないですが、issue の内容は stackrio の両方のパッケージで同名のモジュールがある場合でも、ちゃんと読み込めるようになったみたいです。

Path.Extra (in stack, rio)
RIO (in stack, rio)
RIO.Logger (in stack, rio)
RIO.Prelude (in stack, rio)
RIO.Process (in stack, rio)

With ghci, allow multiple packages to use the same module #3776 #3779 で修正されました。

ghciPkgModules の型を Set ModuleName から ModuleMap に変更しています。

モジュール名ファイルの絶対パス の順番で探して、その中を Set (PackageName, NamedComponent) で持つようになっています。今まではモジュール名の Set だったので確かに複数のパッケージでも上手く処理できそうな感じがします。


  • stack ghcibase の依存関係を追加する必要が無くなりました。これはローカルターゲットが存在しない場合に自動的に追加されるためです。これにより、base を置き換えているコードも同様に読み込めるようになります (#3589)

修正のコミットを見ると "-package" : "base" が明示的に追加されています。


  • --no-rerun-tests が修正されました。今まではテストを実行した後に結果の記録を忘れていました。そのため、前回テストにパスしていたとしても、常に全てのテストが実行されていました (#3770)

  • hackage-security のパッチを当てたバージョンを含めるようにしました。このパッチには機械故障や SIGKILL に対して更新処理が正しく復帰できるように、非同期例外処理に関する問題とディレクトリロックからファイルロックへの変更の2つが含まれます (hackage-security #187, #3073)

この問題よくわかってないのですが、stack のコミットは extra-deps にパッチの当たっている hackage-security を追加しただけです。(コミット)

実際のパッチは以下の2つです。

Bug fix (オリジナル)

  • 1.6.1 introduced a change that made some precompiled cache files use longer paths, sometimes causing builds to fail on windows. This has been fixed. See #3649
  • The script interpreter’s implicit file arguments are now passed before other arguments. See #3658. In particular, this makes it possible to pass -- +RTS ... -RTS to specify RTS arguments used when running the script.
  • Don’t ignore the template year parameter in config files, and clarify the surrounding documentation. See #2275.
  • Benchmarks used to be run concurrently with other benchmarks and build steps. This is non-ideal because CPU usage of other processes may interfere with benchmarks. It also prevented benchmark output from being displayed by default. This is now fixed. See #3663.
  • Some unnecessary rebuilds when no files were changed are now avoided, by having a separate build cache for each component of a package. See #3732.
  • Correct the behavior of promoting a package from snapshot to local package. This would get triggered when version bounds conflicted in a snapshot, which could be triggered via Hackage revisions for old packages. This also should allow custom snapshots to define conflicting versions of packages without issue. See Stackage issue #3185.
  • When promoting packages from snapshot to local, we were occassionally discarding the actual package location content and instead defaulting to pulling the package from the index. We now correctly retain this information. Note that if you were affected by this bug, you will likely need to delete the binary build cache associated with the relevant custom snapshot. See #3714.
  • stack ghci now allows loading multiple packages with the same module name, as long as they have the same filepath. See #3776.
  • stack ghci no longer always adds a dependency on base. It is now only added when there are no local targets. This allows it to be to load code that uses replacements for base. See #3589
  • --no-rerun-tests has been fixed. Previously, after running a test we were forgetting to record the result, which meant that all tests always ran even if they had already passed before. See #3770.
  • Includes a patched version of hackage-security which fixes both some issues around asynchronous exception handling, and moves from directory locking to file locking, making the update mechanism resilient against SIGKILL and machine failure. See hackage-security #187 and #3073.

まとめ

  • stack ghci 周りのバグフィックスもいくつかあったので ghci を多用する人にとっては嬉しいですね。
  • 古い LTS を使っているプロジェクトでビルドができなくて困っている人は 1.6.5 にアップデートすると直るかもしれません。

以上です。