Posted on May 4, 2018 authored by Shinya Yamaguchi

Last Updated October 21, 2018

はじめに

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 9a23b91bd1ba4d120a77c9982e85079f825ebf06

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 は利用できなくなりました。

GHC 8.2.2 から CentOS 6 の 32-bit Linux GMP4 はサポートされなくなりました。そのため stack も利用できなくなりました。

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

else install_dependencies case " $1 " in "6" ) print_bindist_notice "libgmp4" install_32bit_gmp4_linked_binary ;; * ) print_bindist_notice install_32bit_standard_binary ;; esac fi

大きな変更

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

変更点

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

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

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

issue PR Initialize a new project only when no stack.yaml #3888 commit

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

- initProject IsNewCmd dir initOpts globalResolver + exists <- doesFileExist $ dir </> stackDotYaml + when (forceOverwrite initOpts || not exists) $ + initProject IsNewCmd dir initOpts globalResolver

その他の改良点

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

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

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

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

$ stack list-dependencies list-dependencies DEPRECATED : Use ls dependencies instead. Will be removed in next major version. : Use ls dependencies instead. Will be removed in next major version. ...

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

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

+setUserAgent :: Request -> Request +setUserAgent = setRequestHeader "User-Agent" ["The Haskell Stack"]

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

ビルドプログレスバーが現在ビルドしているパッケージ名を表示するようになりました。

issue PR Report currently building packages along with “Progress:” label #3763 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 設定処理のログを含めるようにしました。

変更前は以下のように 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 が見つからなかった時のエラーメッセージが改善されました。

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

Windows 環境では Nix インテグレーションがサポートされていないため、明示的にフラグを有効にした場合でも常に無効になるように変更しました。

stack build に --keep-tmp-files フラグを追加しました。デバッグ目的のため一時的に作成したファイルやディレクトリを削除せずに残しておくことができます。このフラグは同等の機能を持つ ghc オプションと同時に使うと良いでしょう。例: stack build --keep-tmp-files --ghc-options=-keep-tmp-files

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

build : library-profiling : false executable-profiling : false copy-bins : false prefetch : false keep-going : false keep-tmp-files : false

スナップショットのパーズ例外時のエラーメッセージを改善しました。

issue PR Improved error messages for snapshot parse exceptions #3879 commit

stack unpack コマンドに --to /target/directory オプションが追加されました。パッケージの展開先を指定できるようになります。

stack hoogle コマンドに --server オプションが追加されました。ローカルのポート8080番で Hoogle サーバーが起動します。

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

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

extra-deps で github という短縮形が使えるようになりました。

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

- github : commercialhaskell/rio commit : 09654f9fcbdcd96d0f5102796b32fdac5da7260e

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

- github : commercialhaskell/rio commit : "09654"

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

バグフィックス

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

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

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

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

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

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

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

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

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

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

stack ghci コマンドで autogen ファイルのパスを適切に扱えるようになりました。

stack はサブディレクトリを含むパッケージを常に再コンパイルしていました。現在は修正され、サブディレクトリを再コンパイルする必要がある時だけ行うようになりました。

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

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

issue PR commit 9dfff2760b659c84605028002cd6500cdb52c823

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

Nix を利用する場合に gmp で Cabal-simple をコンパイルするように修正しました。

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

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

$ tree /tmp/haskell-stack-ghci/ /tmp/haskell-stack-ghci/ /tmp/haskell-stack-ghci/ ba125cb0 ├── cabal_macros.h │ └── e4ed4429 └── ghci-script └── 2 directories, 2 files directories, 2 files

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.

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.

has been introduced to stack to view local and remote snapshots present in the system. Use 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.

has been deprecated. The functionality has to accessed through the new 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.

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

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

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

now supports a new flag to retain intermediate files and directories for the purpose of debugging. It is best used with ghc’s equivalent flag, i.e. . 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

now supports a 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