Posted on October 22, 2018 authored by Shinya Yamaguchi

Last Updated October 23, 2018

はじめに

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 (翻訳)

リリースノート

参考リンク

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

大きな変更点

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



参考リンク

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

参考リンク

変更点

stack.yaml の ghc-options と config.yaml の ghc-options を結合するようにしました。今までは置き換えていました。

解説

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

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

# stack.yaml resolver : lts-12.13 packages : - . ghc-options : "$everything" : "bbb"

パッケージの指定が重複していたときに今までは、 stack.yaml (プロジェクト固有) の ghc-options で上書きされていましたが、 stack.yaml の ghc-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.yaml resolver : lts-12.13 packages : - . ghc-options : "$everything" : "-dumpdir=./respect-stack"

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

$ 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

参考リンク

参考リンク

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

参考リンク

参考リンク

その他の改良点

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

参考リンク

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

参考リンク

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

参考リンク

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 をコピーできるようになります。

参考リンク

参考リンク

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

参考リンク

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

参考リンク

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

参考リンク

参考リンク

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

参考リンク

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

参考リンク

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

参考リンク

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

参考リンク

バグフィックス

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

参考リンク

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

参考リンク

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

参考リンク

参考リンク

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

参考リンク

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

参考リンク

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

参考リンク

参考リンク

参考リンク

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

参考リンク

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

参考リンク

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

解説

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

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

# package.yaml name : test-internal dependencies : - base internal-libraries : internal-foo : {}

自動生成される 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

参考リンク

参考リンク

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.

from are now appended to from , 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

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

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.

option to 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 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

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.

. In particular, for legacy 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 , 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

signs the package by default, as documented. 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

issues a warning when is explicitly listed in of stack build suggests trying another GHC version should the build plan end up requiring unattainable base version.

suggests trying another GHC version should the build plan end up requiring unattainable 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.

has been introduced to build and run a specified executable similar to . 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.

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.

option to , 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.

command line option and config value which causes multiple concurrent builds to dump to stderr at the same time with a 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

now allows template names of the form to download from a user other than on Github, and can be prefixed with the service , , or . #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

to include some unmerged bugfixes in Suggestion to add 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

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.

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.

, by using 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