はじめに

10月18日に Stack version 1.9.1 がリリースされました。

更新は stack upgrade コマンドを実行します。

$ stack upgrade
Current Stack version: 1.7.1, available download version: 1.9.1
Newer version detected, downloading
Querying for archive location for platform: linux-x86_64-static
Downloading from: https://github.com/commercialhaskell/stack/releases/download/v1.9.1/stack-1.9.1-linux-x86_64-static.tar.gz
Download complete, testing executable
Version 1.9.1, Git revision f9d0042c141660e1d38f797e1d426be4a99b2a3c (6168 commits) x86_64 hpack-0.31.0
New stack executable available at /home/guchi/.local/bin/stack
Also copying stack executable to /usr/local/bin/stack
Permission error when trying to copy: /usr/local/bin: copyFile:atomicCopyFileContents:withReplacementFile:openBinaryTempFile: permission denied (Permission denied)
Should I try to perform the file copy using sudo? This may fail
Try using sudo? (y/n)

実行ファイルは ~/.local/bin/stack/usr/local/bin にインストールされます。

ただし、権限が無いと上記のように /usr/local/bin へのコピーに失敗するため sudo で再実行するか聞かれます。必要であれば y でインストールしましょう。

Try using sudo? (y/n) y
Going to run the following commands:

-  sudo cp /home/guchi/.local/bin/stack /usr/local/bin/stack.tmp
-  sudo mv /usr/local/bin/stack.tmp /usr/local/bin/stack

sudo file copy worked!

インストールされるバージョンは以下の通りです。

$ stack --version
Version 1.9.1, Git revision f9d0042c141660e1d38f797e1d426be4a99b2a3c (6168 commits) x86_64 hpack-0.31.0

気になる更新内容まとめ

  • static binary の復活
  • Cabal 2.4 への対応
  • internal-library 関連のバグ修正
  • namespaced template
  • stack run
  • ghci に -fobject-code を渡した際にちゃんとキャッシュされるようになった

Changelog (翻訳)

リリースノート

  • @nh2さんのおかげで、静的にリンクされた Linux バイナリが再び利用できるようになりました。

参考リンク


  • download.fpcomplete.com から Ubuntu, Debian, CentOS, Fedora, Arch のパッケージリポジトリを削除する予定です。これらは既に1年以上前から非推奨となっており、新しいリリースにも対応していませんでしたが、過去のスクリプトとの互換性のために残していました。

大きな変更点

  • Cabal 2.4 にアップグレードしました。
    • 注意点: ファイル名のパターンマッチの動作が変わりました。Cabal spec 2.4 より前のバージョンでは *.txtfoo.txt にマッチしていましたが、foo.2.txt にはマッチしませんでした。

参考リンク


  • GHCJS のサポートが experimental (実験的) へ降格しました。また、GHCJS が実験段階であることをユーザに知らせるための警告が表示されるようになりました。

参考リンク


変更点

  • stack.yamlghc-optionsconfig.yamlghc-options を結合するようにしました。今までは置き換えていました。

解説

グローバルな ~/.stack/.config.yaml とプロジェクト固有の stack.yaml の話で package.yaml は関係しません。

例として、それぞれファイルの内容を以下のように設定しておきます。($everything は全てのパッケージを指定)

パッケージの指定が重複していたときに今までは、stack.yaml (プロジェクト固有) の ghc-options で上書きされていましたが、 stack.yamlghc-options を結合するようになりました。以下は動作例です。

# stack v1.9.1 の動作
$ stack build
... --ghc-options aaa --ghc-options bbb

# stack v1.7.1 の動作
$ stack build
... --ghc-options bbb

ghc-options の内容が重複する場合は両方とも引数に与えられますが、後ろの値で上書きされるようなのでプロジェクト固有の設定が優先されます。

実際に試してみると、以下のようになると思います。

$ stack build -v
... --ghc-options -dumpdir=./respect-config --ghc-options -dumpdir=./respect-stack

$ ls  -l
...
drwxrwxr-x 5 guchi guchi 4096 10月 21 13:35 respect-stack
...

参考リンク


  • stack build コマンドはパッケージのサブライブラリをビルドする際に executables, test, benchmarks, libraries などと同様の方法でアナウンスを行うようになりました。

参考リンク


  • stack sdist コマンドはサニティチェックの結果にかかわらず、生成された tarball の場所をアナウンスするようになりました。

参考リンク


  • stack setup コマンドの --upgrade-cabal オプションは廃止されます。この機能は GHC 8.2 以降では動作しません。また、このフラグが実装された当初の動機は Stack がカスタムセットアップのためにスナップショットの Cabal ライブラリを利用し始めたことでほとんど無くなりました。詳細: #4070

参考リンク


  • 新たに namespaced template 機能が実装されたため、stack templates コマンドは利用可能な全てのテンプレートの一覧を良い感じに表示できなくなりました。代わりに、テンプレートを見つける方法についてのヘルプファイルをダウンロードし、表示します。詳細: #4039

参考リンク


  • ビルドツールを cabal-install と同様の方法で取り扱うようになりました。また、レガシーな build-tools フィールドに対しては、ツールマップの中からビルドツールパッケージを調べるのではなく、ハードコードされたビルドツールのリストを利用します。この変更により Stack の動作は cabal-install に近づいたため、いくつかのバグを回避し、最適化/遅延性の恩恵を得られる可能性があります。詳細: #4125

参考リンク


  • パフォーマンスの低下を避けるため、Mustache テンプレートに (50kb を超える) 大きなファイルを適用できなくなりました。詳細: #4133

参考リンク


  • stack upload はデフォルトでパッケージに署名を行うようになりました。また、--no-signature オプションで署名をスキップできます。詳細: #3739

参考リンク


  • テンプレートダウンロード時のネットワーク接続問題に備えて、事前にチェックを行うようになりました。もし、問題があればキャッシュ済みのテンプレートを利用します。詳細: stack new requires network to work #3850

参考リンク


その他の改良点

  • Windows 10 より前の Windows 環境では、ターミナルのデフォルト値が --color=never となります。エミュレーションによる出力のみ ANSI カラーコードが利用できます。

参考リンク


  • Windows 環境では、デフォルトのターミナルを ‘mintty’ (false) として認識するように変更しました。

参考リンク


  • stack build コマンドは stack.yamlextra-depsbase が明示的に記載されているとき、警告を出すようになりました。

参考リンク


  • stack build コマンドは、ビルドプランで達成不可能な base バージョンが要求された際に、別の GHC バージョンを試すように提案するようになりました。

参考リンク


  • 新たなサブコマンド run が導入されました。このコマンドは cabal run のように、指定された executable をビルド&実行します。executable が省略された場合は、プロジェクト内で最初に利用可能な executable が指定されます。

参考リンク


  • stack build コマンドは、依存関係が足りない旨を伝えるメッセージにパッケージの最新の cabal ファイルリビジョンハッシュを含めるようになりました。詳細: #4068

解説

こんな感じで表示されるようです。

...
  * Recommended action: try adding the following to your extra-deps in /home/thomas/github/stack/stack.yaml:
rio-0.1.2.0@sha256:cb2a65cee1c0450815002ca890633215e4544b5c1c9f7091a950142c6efe8f3f

参考リンク


  • stack sdist コマンドに新しく --tar-dir オプションを追加しました。このオプションにより指定したディレクトリに生成された tarball をコピーできるようになります。

参考リンク


  • --interleaved-output オプションと build.interleaved-output 設定値が導入されました。これにより、複数の並行ビルドの出力が packagename> プレフィックス付きで同時に標準エラー出力にダンプされます。詳細: #3225

参考リンク


  • デフォルトの再接続戦略を exponential backoff に変更しました。これにより #3510 の問題が緩和されます。

参考リンク


  • stack new コマンドは username/foo という形式で、commercialstack 以外のリポジトリからテンプレートをダウンロードできるようになりました。また github: という形式でプレフィックスを付けることでサービスを指定することもできます。現状は github: の他に gitlab:bitbucket: が利用可能です。

参考リンク


  • gitrev から githash に切り替えました。このパッケージには gitrev にマージされていないバグフィックスが含まれています。

参考リンク


  • 'allow-newer': true を追加するファイルがわかりづらいため、ユーザ設定ファイルへのパスをエラーメッセージに含めるようにしました。詳細: #3685

参考リンク


  • stack ghci コマンドはビルド後ではなく、ビルド前にどのメインターゲットを読み込むか質問するようになりました。

参考リンク


  • hpack のバージョンを 0.29.0 に更新しました。

参考リンク


  • GHC 8.4 以降のバージョンを利用したとき、自動的に Haddock へ --quickjump オプションが渡されるようになります。

参考リンク



  • Nix 利用時に GHC のマイナーバージョンを省略した場合、メジャーブランチの最新のマイナーバージョンを自動的に利用するようになりました。

参考リンク


バグフィックス

  • stack ghci を繰り返し実行したときに .o ファイルを無効化しなくなりました。これにより、-fobject-code でコンパイルされた全てのモジュールは ghci を実行する度にキャッシュされます。 詳細: #4038

参考リンク


  • ~/.stack/config.yamlstack.yaml の最後に改行が追加されました。

参考リンク


  • 前回のリリースで ghc-pkg コマンドの出力が stderr に出力されてしまう問題が再発したので修正しました。現在の出力はとても静かになりました。

参考リンク


  • v1.7.1 で導入された再コンパイルチェックの問題を修正し、回帰テストを追加しました。詳細: #4001

参考リンク


  • stack ghci は internal library を含むパッケージの処理で internal libray に対応する間違ったパッケージを探し、モジュールの読み込みに失敗していました。この問題は現在修正済みで、ライブラリとサブライブラリが適切に追跡されるようにコードが変更されました。詳細: #3926

参考リンク


  • internal library に依存していないパッケージを stack build すると、internal library をビルドしていないのにも関わらず登録しようとするため、ビルドに失敗していました。この問題は internal library を常にビルドすることで解決しました。

参考リンク


  • NixOS 環境では --no-nix オプションの影響を受けなくなりました。

参考リンク


  • RAM を大量に消費してしまう問題が再発していたので修正しました。詳細: #4027

参考リンク


  • コマンドラインの引数の順序によって動作が異なる問題を修正しました。詳細: #3959

参考リンク


  • パッケージをアップロードする際の Hackage クレデンシャル保存プロンプトで、ユーザの入力前に表示されなければならないメッセージが入力後に表示されてしまっていた問題を修正しました。ghci のターゲット選択プロンプトでも同様の問題が発生していたので修正しました。

参考リンク


  • stack solver コマンドで、PATH に cabal が存在しない場合、ユーザに対して stack install cabal-install の実行を促すためのメッセージが表示されるようになりました。

参考リンク


  • stack build コマンドはサブライブラリを含むパッケージが executable, test, benchmark などの依存関係になっている場合でも、正しくビルドできるようになりました。詳細: #3787.

解説

Cabal 2.0 から internal Libraries が追加され、stack 側も対応したという感じです。

例として以下のような package.yaml があった場合

自動生成される cabal ファイルは以下のようになります。

name:           test-internal
version:        0.0.0
build-type:     Simple
cabal-version:  >= 2.0

library internal-foo
  other-modules:
      Paths_test_internal
  build-depends:
      base
  default-language: Haskell2010

この状態でビルドした結果は次のとおりです。

# v1.7.1
$ stack build
Package has buildable sublibraries but no buildable libraries, I'm giving up
CallStack (from HasCallStack):
  error, called at src/Stack/Package.hs:280:30 in stack-1.7.1-JqFYW3fz7If7um4NzPRwPj:Stack.Package

# v1.9.1
$ stack build
test-internal-0.0.0: configure (internal-lib)
Configuring test-internal-0.0.0...
test-internal-0.0.0: build (internal-lib)
Preprocessing library 'internal-foo' for test-internal-0.0.0..
Building library 'internal-foo' for test-internal-0.0.0..
[1 of 1] Compiling Paths_test_internal ( .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/internal-foo/autogen/Paths_test_internal.hs, .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/internal-foo/Paths_test_internal.o )
ignoring (possibly broken) abi-depends field for packages
test-internal-0.0.0: copy/register
Installing internal library internal-foo in /home/guchi/Desktop/stack-191-working/test-internal/.stack-work/install/x86_64-linux/lts-12.14/8.4.3/lib/x86_64-linux-ghc-8.4.3/test-internal-0.0.0-6jijyMwb8IH16YEILzaUQW-internal-foo

参考リンク


  • internal library に依存したテストスイートのカバレッジレポートで、サブライブラリが適切に処理されるようになりました。以前まではカバレッジレポートを生成するときにエラーとなっていました。詳細: #4105

参考リンク


  • スナップショット更新時にサブライブラリがプリコンパイルキャシュに追加されるようになりました。以前まではスナップショットにサブライブラリを含むパッケージが存在するようなスナップショットを更新するとビルドが壊れていました。詳細: #4071

参考リンク


  • Stack は warning の代わりに適切な error ログレベルでエラーメッセージをプリティプリントするようになりました。これにより self-executing scripts で runhaskell のプラン構築エラーがターミナルに出力されない問題も修正されます。詳細: #4114

参考リンク


  • Cabal の呼び出しに失敗した際に “While building Setup.hs” という間違ったメッセージが表示されていた問題を修正しました。詳細: #3934

参考リンク


Changelog (オリジナル)

Release notes

  • Statically linked Linux bindists are back again, thanks to @nh2.
  • We will be deleting the Ubuntu, Debian, CentOS, Fedora, and Arch package repos from download.fpcomplete.com soon. These have been deprecated for over a year and have not received new releases, but were left in place for compatibility with older scripts.

Major changes

  • Upgrade to Cabal 2.4
    • Note that, in this process, the behavior of file globbing has been modified to match that of Cabal. In particular, this means that for Cabal spec versions less than 2.4, *.txt will match foo.txt, but not foo.2.txt.
  • GHCJS support is being downgraded to ‘experimental’. A warning notifying the user of the experimental status of GHCJS will be displayed.

Behavior changes:

  • ghc-options from stack.yaml are now appended to ghc-options from config.yaml, whereas before they would be replaced.
  • stack build will now announce when sublibraries of a package are being build, in the same way executables, tests, benchmarks and libraries are announced
  • stack sdist will now announce the destination of the generated tarball, regardless of whether or not it passed the sanity checks
  • The --upgrade-cabal option to stack setup has been deprecated. This feature no longer works with GHC 8.2 and later. Furthermore, the reason for this flag originally being implemented was drastically lessened once Stack started using the snapshot’s Cabal library for custom setups. See: #4070.
  • With the new namespaced template feature, stack templates is no longer able to meaningfully display a list of all templates available. Instead, the command will download and display a help file with more information on how to discover templates. See: #4039
  • Build tools are now handled in a similar way to cabal-install. In particular, for legacy build-tools fields, we use a hard-coded list of build tools in place of looking up build tool packages in a tool map. This both brings Stack’s behavior closer into line with cabal-install, avoids some bugs, and opens up some possible optimizations/laziness. See: #4125.
  • Mustache templating is not applied to large files (over 50kb) to avoid performance degredation. See: #4133.
  • stack upload signs the package by default, as documented. --no-signature turns the signing off. #3739
  • In case there is a network connectivity issue while trying to download a template, stack will check whether that template had been downloaded before. In that case, the cached version will be used. See #3850.

Other enhancements

  • On Windows before Windows 10, –color=never is the default on terminals that can support ANSI color codes in output only by emulation
  • On Windows, recognise a ‘mintty’ (false) terminal as a terminal, by default
  • stack build issues a warning when base is explicitly listed in extra-deps of stack.yaml
  • stack build suggests trying another GHC version should the build plan end up requiring unattainable base version.
  • A new sub command run has been introduced to build and run a specified executable similar to cabal run. If no executable is provided as the first argument, it defaults to the first available executable in the project.
  • stack build missing dependency suggestions (on failure to construct a valid build plan because of missing deps) are now printed with their latest cabal file revision hash. See #4068.
  • Added new --tar-dir option to stack sdist, that allows to copy the resulting tarball to the specified directory.
  • Introduced the --interleaved-output command line option and build.interleaved-output config value which causes multiple concurrent builds to dump to stderr at the same time with a packagename> prefix. See #3225.
  • The default retry strategy has changed to exponential backoff. This should help with #3510.
  • stack new now allows template names of the form username/foo to download from a user other than commercialstack on Github, and can be prefixed with the service github:, gitlab:, or bitbucket:. #4039
  • Switch to githash to include some unmerged bugfixes in gitrev Suggestion to add 'allow-newer': true now shows path to user config file where this flag should be put into #3685
  • stack ghci now asks which main target to load before doing the build, rather than after
  • Bump to hpack 0.29.0
  • With GHC 8.4 and later, Haddock is given the --quickjump flag.
  • It is possible to specify the Hackage base URL to upload packages to, instead of the default of https://hackage.haskell.org/, by using hackage-base-url configuration option.
  • When using Nix, if a specific minor version of GHC is not requested, the latest minor version in the given major branch will be used automatically.

Bug fixes

  • stack ghci now does not invalidate .o files on repeated runs, meaning any modules compiled with -fobject-code will be cached between ghci runs. See #4038.
  • ~/.stack/config.yaml and stack.yaml terminating by newline
  • The previous released caused a regression where some stderr from the ghc-pkg command showed up in the terminal. This output is now silenced.
  • A regression in recompilation checking introduced in v1.7.1 has been fixed. See #4001
  • stack ghci on a package with internal libraries was erroneously looking for a wrong package corresponding to the internal library and failing to load any module. This has been fixed now and changes to the code in the library and the sublibrary are properly tracked. See #3926.
  • For packages with internal libraries not depended upon, stack build used to fail the build process since the internal library was not built but it was tried to be registered. This is now fixed by always building internal libraries. See #3996.
  • --no-nix was not respected under NixOS
  • Fix a regression which might use a lot of RAM. See #4027.
  • Order of commandline arguments does not matter anymore. See #3959
  • When prompting users about saving their Hackage credentials on upload, flush to stdout before waiting for the response so the prompt actually displays. Also fixes a similar issue with ghci target selection prompt.
  • If cabal is not on PATH, running stack solver now prompts the user to run stack install cabal-install
  • stack build now succeeds in building packages which contain sublibraries which are dependencies of executables, tests or benchmarks but not of the main library. See #3787.
  • Sublibraries are now properly considered for coverage reports when the test suite depends on the internal library. Before, stack was erroring when trying to generate the coverage report, see #4105.
  • Sublibraries are now added to the precompiled cache and recovered from there when the snapshot gets updated. Previously, updating the snapshot when there was a package with a sublibrary in the snapshot resulted in broken builds. This is now fixed, see #4071.
  • [#4114] Stack pretty prints error messages with proper error logging level instead of warning now. This also fixes self-executing scripts not piping plan construction errors from runhaskell to terminal (issue #3942).
  • Fix invalid “While building Setup.hs” when Cabal calls fail. See: #3934
  • stack upload signs the package by default, as documented. --no-signature turns the signing off. #3739