はじめに

4月28日に Stack version 1.7.1 がリリースされました。

更新は以下のコマンドですぐに終わります。

$ stack upgrade
...

$ stack --version
Version 1.7.1, Git revision 681c800873816c022739ca7ed14755e85a579565 (5807 commits) x86_64 hpack-0.28.2

リリースノート

  • aarch64 (64ビットARM) で初めて stack が利用できるようになりました。
issue
PR
commit

stack のダウンロードリンクが https://www.stackage.org/stack/ から https://get.haskellstack.org/stable/ に変わりました。

各種バイナリへのリンクは https://get.haskellstack.org/stable/<PLATFORM>.<EXTENSION> という形式になるようです。

  • GHC 8.2.2 への対応が困難なため、静的にリンクされた Alpine Linux 向け stack は利用できなくなりました。
issue
PR
commit
  • GHC 8.2.2 から CentOS 6 の 32-bit Linux GMP4 はサポートされなくなりました。そのため stack も利用できなくなりました。
issue
PR
commit

実際のコードを見てみるとまだ使えそうな気がしますが、stack 1.7.1 からはリンク切れになります。(stack v1.6.5 とかであればダウンロード可能です。)

大きな変更

  • Cabal のバージョンを 2.0 から 2.2 にアップグレードしました。
issue
PR
commit

変更点

  • GCC を利用する Linux ディストリビューションで、デフォルトで PIE が有効になっている場合、stack setup コマンドは異なる GHC 設定オプションを利用しなくなりました。ghc-8.0.2 から GHC は自分自身で検出できるようになり、Stack’s attempted workaround for older versions caused more problems than it solved.
issue
PR
commit

いまいち良くわかってないですが、コードの差分を見ると noPie に関する部分が全部削除されてるので、その辺りを GHC が上手く処理するようになったんでしょう・・・。

  • stack new コマンドは、プロジェクトテンプレートに stack.yaml ファイルが含まれる場合に、初期化処理を行わないようになりました。
issue
PR
commit

今まで通り stack.yaml が含まれている場合でも初期化させたい場合はforceOverwrite initOptsTrue になれば良いので、--force フラグをつければ良さそうですね。

その他の改良点

  • stack に新たなサブコマンド ls が導入されました。このコマンドによってローカル及びリモートのスナップショットを確認することができます。詳細は stack ls snapshots --help コマンドでご確認ください。
issue
PR
commit

過去のブログ記事で紹介しているので気になる方はご参照ください。

  • list-dependencies コマンドが廃止されます。同等の機能は ls dependencies コマンドで引き続き提供されます。
issue
PR
commit

v1.7.1 ではまだ利用できますが、以下のように DEPRECATED メッセージが表示されます。一応 v1.8 で削除される予定です。

  • 全ての HTTP リクエストヘッダに User-Agent が追加されるようになりました。
issue
PR
commit

今までは User-Agent が付いていなかったみたいですが、The Haskell Stack が全てのHTTPリクエストに対して付与されるようになったみたいです。

  • stack setup コマンドは互換性のある GHC をインストールするために、任意の OS キーによるインストールを試すようになりました (これは OS キーをどれか1つだけチェックするよりも良い方法です)。この変更は Linux の各ディストリビューションで libinfo 5/6, ncurses 5/6, gmp 4/5 の異なった組み合わせに起因するものです。今後の GHC リリースを見据えて、セットアップに関する YAML メタデータをシンプルに保つことができます。
issue
PR
commit
  • ビルドプログレスバーが現在ビルドしているパッケージ名を表示するようになりました。
issue
PR
commit

変更前の表示結果

Progress: 3/74

変更後の表示結果

Progress: 3/74; [Cabal-2.0.1.1|basement-0.0.4|old-time-1.1.0.3|simple-sendfile-0.2.26|stm-2.4.4.1|stringsearch-0.3.6.6]
  • stack setup --verbose の出力に GHC 設定処理のログを含めるようにしました。
issue
PR
commit

変更前は以下のように Configuring GHC ... で何も表示されていなかったようです。

$ stack build --verbose
...

2017-12-27 00:30:23.869257: [debug] Run process: /home/gleb/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2.temp/ghc-8.0.2/configure --prefix=/home/gleb/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/
@(System/Process/Log.hs:37:3)
Configuring GHC ...

変更後は、こんな感じのログが続いて表示されるようになったようです。

...
018-01-03 10:49:29.280793: [debug] Run process within /home/kp/.stack/programs/x86_64-linux/ghc-7.10.3.temp/ghc-7.10.3/: /usr/bin/make install
@(subs/rio/src/RIO/Process.hs:191:3)
2018-01-03 10:49:29.304283: [info] /usr/bin/make -r --no-print-directory -f ghc.mk install BINDIST=YES NO_INCLUDE_DEPS=YES
@(Stack/Setup.hs:1096:54)
2018-01-03 10:49:29.737966: [info] "rm" -f utils/ghc-pkg/dist-install/build/Version.hs
@(Stack/Setup.hs:1096:54)
2018-01-03 10:49:29.739872: [info] echo "module Version where"                    >> utils/ghc-pkg/dist-install/build/Version.hs
@(Stack/Setup.hs:1096:54)
2018-01-03 10:49:29.741026: [info] echo "version, targetOS, targetARCH :: String" >> utils/ghc-pkg/dist-install/build/Version.hs
@(Stack/Setup.hs:1096:54)
2018-01-03 10:49:29.742170: [info] echo "version    = \"7.10.3\""      >> utils/ghc-pkg/dist-install/build/Version.hs
  • ファイルパスまたは git 参照から extra-dep が見つからなかった時のエラーメッセージが改善されました。
issue
PR
commit

こんな感じでエラーメッセージが改善されたようです。

  • Windows 環境では Nix インテグレーションがサポートされていないため、明示的にフラグを有効にした場合でも常に無効になるように変更しました。
issue
PR
commit
  • stack build--keep-tmp-files フラグを追加しました。デバッグ目的のため一時的に作成したファイルやディレクトリを削除せずに残しておくことができます。このフラグは同等の機能を持つ ghc オプションと同時に使うと良いでしょう。例: stack build --keep-tmp-files --ghc-options=-keep-tmp-files
issue
PR
commit

stack.yamlbuild セクションに指定することもできるようです。(デフォルト値は False)

  • スナップショットのパーズ例外時のエラーメッセージを改善しました。
issue
PR
commit
  • stack unpack コマンドに --to /target/directory オプションが追加されました。パッケージの展開先を指定できるようになります。
issue
PR
commit
  • stack hoogle コマンドに --server オプションが追加されました。ローカルのポート8080番で Hoogle サーバーが起動します。
issue
PR
commit

stack hoogle --serverstack hoogle -- server --local --port 8080 の省略形です。

リリースノートに載ってない変更

  • extra-depsgithub という短縮形が使えるようになりました。
issue
PR
commit

以下のように書くことができます。

commit は短縮して記述することもできます。

BuildPlanSpec.hs にテストがいくつか載っていいるので、そこを見れば利用可能な形式がわかります。

バグフィックス

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

v.1.6.5 の時に紹介したので、そちらをご確認ください。

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

v.1.6.5 の時に紹介したので、そちらをご確認ください。

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

v.1.6.5 の時に紹介したので、そちらをご確認ください。

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

v.1.6.5 の時に紹介したので、そちらをご確認ください。

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

v.1.6.5 の時に紹介したので、そちらをご確認ください。

  • stack ghci コマンドで autogen ファイルのパスを適切に扱えるようになりました。
issue
PR
commit
  • stack はサブディレクトリを含むパッケージを常に再コンパイルしていました。現在は修正され、サブディレクトリを再コンパイルする必要がある時だけ行うようになりました。
issue
PR
commit

特に HakyllPandoc (依存しているライブラリも同様に影響を受ける) を使う場合に踏み抜く可能性があるため、影響を受けている人はアップグレード推奨です。

  • get-stack.sh インストールスクリプトにおいて Debian/Fedora/CentOS の依存関係のインストールをドキュメントの手動で行う場合と一致するように修正しました。
issue
PR
commit

Manual Download の内容と同様の処理になりました。(gitgnupg が追加されました)

  • Nix を利用する場合に gmp で Cabal-simple をコンパイルするように修正しました。
issue
PR
commit
  • stack ghci コマンドの stack 処理は ghci で置き換えられました。これによりシグナルハンドリングの動作が改善されます。特に Ctrl-C のハンドリングが改善されます。そのため、生成されたファイルは終了後に残ります。このパスはファイルコンテンツのハッシュにより決まり、システムの一時的なディレクトリに保存されます。そのため、必要に応じて綺麗にしましょう。
issue
PR
commit

stack repl を実行すると、実際にはこんな感じでディレクトリとファイルが作られます。ba125cb0e4ed4429 というファイル名はファイルのコンテンツハッシュによって決まるそうです。(tmp というディレクトリ名は環境によって異なります)

Changelog (オリジナル)

Release notes

  • aarch64 (64-bit ARM) bindists are now available for the first time.
  • Statically linked Linux bindists are no longer available, due to difficulty with GHC 8.2.2 on Alpine Linux.
  • 32-bit Linux GMP4 bindists for CentOS 6 are no longer available, since GHC 8.2.2 is no longer being built for that platform.

Major changes

  • Upgrade from Cabal 2.0 to Cabal 2.2

Behavior changes

  • stack setup no longer uses different GHC configure options on Linux distributions that use GCC with PIE enabled by default. GHC detects this itself since ghc-8.0.2, and Stack’s attempted workaround for older versions caused more problems than it solved.
  • stack new no longer initializes a project if the project template contains a stack.yaml file.

Other enhancements

  • A new sub command ls has been introduced to stack to view local and remote snapshots present in the system. Use stack ls snapshots --help to get more details about it.
  • list-dependencies has been deprecated. The functionality has to accessed through the new ls dependencies interface. See #3669 for details.
  • Specify User-Agent HTTP request header on every HTTP request. See #3628 for details.
  • stack setup looks for GHC bindists and installations by any OS key that is compatible (rather than only checking a single one). This is relevant on Linux where different distributions may have different combinations of libtinfo 5/6, ncurses 5/6, and gmp 4/5, and will allow simpifying the setup-info metadata YAML for future GHC releases.
  • The build progress bar reports names of packages currently building.
  • stack setup --verbose causes verbose output of GHC configure process. See #3716
  • Improve the error message when an extra-dep from a path or git reference can’t be found See #3808
  • Nix integration is now disabled on windows even if explicitly enabled, since it isn’t supported. See #3600
  • stack build now supports a new flag --keep-tmp-files to retain intermediate files and directories for the purpose of debugging. It is best used with ghc’s equivalent flag, i.e. stack build --keep-tmp-files --ghc-options=-keep-tmp-files. See #3857
  • Improved error messages for snapshot parse exceptions
  • stack unpack now supports a --to /target/directory option to specify where to unpack the package into
  • stack hoogle now supports a new flag --server that launches local Hoogle server on port 8080. See #2310

Bug fixes

  • 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.
  • 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
  • stack ghci now uses correct paths for autogen files with #3791
  • When a package contained sublibraries, stack was always recompiling the package. This has been fixed now, no recompilation is being done because of sublibraries. See #3899.
  • The get-stack.sh install script now matches manual instructions when it comes to Debian/Fedora/CentOS install dependencies.
  • Compile Cabal-simple with gmp when using Nix. See #2944
  • stack ghci now replaces the stack process with ghci. This improves signal handling behavior. In particular, handling of Ctrl-C. To make this possible, the generated files are now left behind after exit. The paths are based on hashing file contents, and it’s stored in the system temporary directory, so this shouldn’t result in too much garbage. See #3821.