Crystal 0.35.0 has been released!
今回のリリースはみなさんの待ち望んでいた、1.0直前の標準ライブラリに磨きをかけるものです。この中には最近のいくつかの追加やより洗練された実装の繰り返しといった、多くの活動があります。他には、デバッグの改善や Windows のサポート、その他のプラットフォームでのランタイムの安定化などを含みます。
このリリースが最後のバージョン 0.x のリリースになるでしょう。1.0.0-preX のリリースに向けて準備をしていてください。
There are 242 commits since 0.34.0 by 38 contributors.
それでは今回のリリースのハイライトを紹介していきます。たくさんの紹介するものがあります。Don’t miss out on the rest of the release changelog which has a lot of valuable information.
言語の変更
網羅性チェック (テイク2)
前回のリリースで、コンパイラは case 文の条件節の網羅性チェックをするようになりました。ですが、フィーバックを受けて、次のことを決定しました。
case ... when
を前のように戻す。暗黙のelse nil
があって、条件節は網羅的でなくてもよい。case ... in
文を実験的に導入する。こちらは暗黙のelse
を持たず、条件の網羅性が確認できなければコンパイルが通らない。実験的というのはフォードバックを元に変更される可能性がある、ということです。たとえマイナーリリースの間でも、その変更は行なわれる可能性があります。
この決定によって case ... when
の意味は身近なままとなり、既存のコードに影響することなく網羅性チェックをする case 文を洗練させていくことが可能になります。Read more at #9258 and #9045.
# Compiles! Totally fine
case 1 || "a"
when Int32
end
# Error: missing case String
case 1 || "a"
in Int32
end
この変更によって in
が正式なキーワードとなりました。これは破壊的な変更ですが、in
はこれまでもマクロ中ではキーワードとして扱われていました。
コンパイラ
コンパイラに破壊的な変更があり、コンパイラの CLI がシバン #!
によるスクリプトをより安心して動作させられるようになりました。これからは、コマンドの代わりにファイルを引数にしてコンパイラを実行すると (crystal path/to/file.cr arg1 arg2
のように)、ファイルがコンパイルされて、そしてそれを実行する、という動作をします。このとき、引数はプログラムにだけ影響して、コンパイラに影響しない、ということです。
コンパイラフラグを使いたい場合や引数と共にプログラムを実行したい場合は、次のように run コマンドが使えます。crystal run path/to/file.cr -Dcompiler_flag --release -- arg1 arg2
--
はコンパイラのオプションとプログラムのオプションを切り分けます。Read more at #9171.
他の破壊的な変更としては、crystal env
がシェル向けにクオートをするようになりました。つまり、eval "$(crystal env)"
が安全にできるようになったということです。また、crystal env VARIABLE
はこれまでの通りです。Read more at #9428
パーサーはたくさんの愛を受けました。Fixing edge cases, bugs and even a considerable refactor in #9208.
言語のいくつかの機能はより良い動作のために反芻が必要でした。このリリースではオートキャストが多重ディスパッチやユニオンのデフォルト値に対して動作するようになりました。Read more at #9004 and #9366. これはいくつかの場合の予期しない残念な挙動を解決するでしょう。
既存の機能の改善の背景には、Crystal のデバッグ機能の改善を待ち望まれていたことがあります。The story is not yet complete, but in #8538 a huge step forward was made. You can check out an article about how to debug a Crystal program in VS Code article for more information, configuration and screenshots.
@[Link]
アノテーションは少しだけ再デザインされました。pkg-config とより統合されて、static:
オプションのサポートが無くなりました。これによって将来、デフォルト値をいい感じに提供しつつ、リンクを詳細に設定できるようにすることを見据えています。Read more at #8972.
Crystal パッケージのメンテナにとって、コンパイラをビルドする際にCRYSTAL_CONFIG_PATH
が標準ライブラリのパスのみを必要とするようになったという知らせは価値があるでしょう。lib
ディレクトリはコンパイラによって常に含まれるようになりました。将来的には shaeds のインストールパスを細かく設定できるようにしたいと考えています。Read more at #9315.
その他の変更として、SOURCE_DATE_EPOCH
という環境変数を使うことでコンパイラをビルドする際にソースコードの時刻を伝えることができるようになりました。Read more at #9088.
Shards
Shards v0.11.1 が今回のリリースではバンドルされます。
今回の把握すべき主要な変更は crystal:
プロパティが効果的に機能するようになった点です。このプロパティは、有効な shard のバージョンを Crystal 環境に基いて決定するのに使われます。You can check the semantics in shards/SPEC.md.
後方互換性のために crystal:
プロパティが shard.yml
に無かった場合、< 1.0.0
として解釈されます。よって、Crystal 1.0.0 まではそのままでも動作し続けるでしょう。また、この挙動が不便な場合は、--ignore-crystal-version
を渡すことでこのチェックを無視できます。
利用者の期待を高めるには、依存するバージョンを明示する必要があると考えられます。そして、標準ライブラリや言語のバージョンもまた依存関係なのです。
crystal:
プロパティの動作は依存関係のバージョン指定とほとんど同じように動作します。違いは、利便性のため crystal: x.y.z
が ~> x.y, >= x.y.z
のように (つまり、 >= x.y.z, < (x+1).0.0
) 解釈されることです。この結果、任意のメジャーリリースで何らかの対応が必要になります。
shards install
を現在のプロジェクトで実行することを推奨します。これによって、shard.lock
がいくつかの追加の新しいバージョンのフォーマットを持つことに気付くかもしれません。そして、lib/.shards.info
ファイルがインストールした依存関係を説明するものとして追加されています。この新しいファイルはバージョン管理システムでトラックする必要はありません。
最後に、依存関係のバージョン指定で version: >= 1.0.0, < 2.0
のように複数の指定を交差させられるようになったことを紹介します。
For a comprehensive list of changes in this shards version you can check its changelog.
標準ライブラリ
このリリースにはいくつもの破壊的変更が含まれます。それらの大半は普通、非推奨の警告が出るようになっています。標準ライブラリの整理なしに1.0へと進むことはないつもりです。このような整理は以前にもあったはずです。これに優先順位を付けることは簡単ではなく、地道に進めています。
計算結果の出力や入力に IO
を引数に取る多くのメソッドがあります。In #5916 you can read the motivation to standardize them as the first argument in these functions. It got implemented in #9134 and some follow up PRs.
Related to all these IO
methods, on String
, instead of returning String
values, there are new overloads to emit directly the result to the IO
; read more in #9236. この影響を受けるのは #underscore
、#titleize
、#capitalize
、#upcase
、そして#downcase
といったメソッドです。
Keep an eye on #9291 for a proposal to improve the interpolation of strings so they can emit directly to an
IO
.
その他の IO
の破壊的な変更としては、#skip
、#write
、#write_utf8
、#write_byte
、#write_bytes
、や#skip_to_end
がスキップした/書き込んだバイト数の数値を返すようになったことがあります。これは他の言語でもそのようになっており、書き込み中に追加の呼び出しなく現在のストリームを位置を把握できるようになります。Read more at #9233 and #9363.
@[Experimental]
アノテーションという、ライブラリや言語、shardの部分に細心の注意と共に使う必要のあるという指定をするためのものが導入されました。実験的な (experimental) 機能は変更や破壊、もしくは削除を Semver の規約に関わらず行なっても良いものとします。今のところ、アノテーションはドキュメントジェネレータで利用されています。ですが、他にも追加の機能のアイディアがあります。Read more at #9244.
Digest
型がリファクタリングされて、いくつかのメソッドの名前が変更されたことに注意する必要があるかもしれません。Read more at #8426.
さて、OptionParser
がサブコマンドを定義できるようになりました。Read more at #9009.
Some other clean-ups: Flate
, Gzip
, Zip
, and Zlib
were moved inside Compress
module in #8886. また、Flate
は Compress::Deflate
に名前が変更されています。require "compress/gzip"
として、これらの定数を変更する必要があります。require "gzip"
は依然として有効ですが、警告メッセージが表示されることになります。
いくつかの変更が File
と FileUtils
にあります。これらは整理されて、強制する操作が両方の API で有効になりました。Read more at #9175.
マクロ
クロスコンパイルの際、host_flag?
というマクロが追加されたことを知っておくと便利でしょう。これは flag?
のようなものですが、ホストのマシンで解決されます。Read more at #9049.
数値計算
符号付きと符号無しの数値の混ざった演算のオーバーフローの検出が修正されました。Read more at #9403.
Int#digits
というメソッドが追加されて、一貫性のため BigInt#digits
の出力が反転されました。Read more at #9383.
シリアライズ
The JSON.mapping
and YAML.mapping
migrated to their own packages: github:crystal-lang/json_mapping.cr and github:crystal-lang/yaml_mapping.cr. これらの機能は十分なものでしたが、現在は JSON::Serializable
と YAML::Serializable
がより良いものとしてあるため、標準ライブラリから削除されました。Read more at #9272.
時刻
これからは Time#to_rfc3339
のデフォルトの精度は秒となり、それ以上の精度は出力されません。より細かな精度が必要な場合は fraction_digits
という名前付き引数に 0. 3, 6, 9 という精度の桁数を指定してください。In #9283 we are dropping the logic to show the fraction of seconds depending on the time value.
ネットワーク
We’ve updated the SSL server secure defaults in #9026. And fixed some HTTP::Server
sporadic failures during SSL handshake in #9177.
そして、HTTP::Server
に2つの破壊的な変更があります。We improved the error handling and logging in #9115 and integrated it with the new logging module. The HTTP::Request#remote_address
type was changed to Socket::Address?
in #9210.
ログ
まず初めに、0.34.0で導入した新しいログモジールを早期に試してフィードバックを送ってくださった皆様に感謝いたします。破壊的な変更を含むいくつかの変更点がありますが、それらは主要な API には影響しません。これらを組み合わせることで、追加の機能といくつかのユースケースでのパーフォマンスの改善を達成しています。
We renamed Log::Severity::Warning
to Warn
in #9293. Log.warn { ... }
がありましたが、これはそのままで、警告を表します。。この変更は :warning
やほとんどの環境変数経由での設定に影響します。Similarly, we dropped Verbose
, and added Trace
and Notice
in #9107.
ログのセットアップがよりシンプルになりました。Log.setup*
系の2つのメソッドがあります。これらのメソッドは常にソースとバックエンドの間のバインディングを完全に設定するでしょう。
Log.setup :debug # will show debug or above in the stdout for all source
Log.setup "db.*", :trace # will show trace or above in the stdout for db.* sources and nothing else
Log.setup_from_env # will grab the value of LOG_LEVEL env variable
Log.setup_from_env
が1つの環境変数を受け取って動作するようになったことにも注意してください。より柔軟なものが今後追加されるかもしれませんが、名前付き引数はより良い体験を提供するはずです。Read more at #9145.
各エントリはこれまでより、現在実行しているファイバーから取得したコンテキストの情報を持っていました。その Log::Context
の責務を Log::Metadata
と Log::Metadata::Value
に分割することにしました。前者はSymbol
から Log::Metadata::Value
へのハッシュのようなデータ構造ですが、アロケーションやアルゴリズム的な最適化がされています。The main work was done in #9227 and #9295. これらのリファクタリングによって、クローンによって獲得していた Log::Metadata::Value
の不変性 (immutability) が無くなりました。
ログエントリにローカルのメタデータや構造化された情報を追加したいという機能が望まれていました。もちろん、現在のファイバのコンテキストに対する変更や復旧が最小であるものが望ましいです。エントリが出力されていない場合は値の生成を省略するという当初の設計を保って、これを達成しました。
Log.info { "Program started" }
Log.info &.emit("Program started") # same as previous
Log.info &.emit("User logged in", user_id: 42) # local data
Log.info &.emit("User logged in", expr_that_computes_hash_named_tuple_or_metadata)
Log.warn exception: e, &.emit("Oh no!", user_id: 42) # with exception
Log.warn exception: e, &.emit("Oh no!") # with exception, no local data
Log.warn(exception: e) { "Oh no!" } # same as previous
Log.info &.emit(action: "log_in", user_id: 42) # empty message
How to create custom log formatters was revisited in #9211. ブロックや Proc からフォーマッタを作る方法はまだ利用できますが、文字列から直接フォーマッタを定義するシンプルな方法を確認してみてください。
出力するログのエントリーをテストしたい場合、新しく追加された Log.capture
というヘルパーが利用できます。Read more at #9201.
並行処理
Concurrent::Future
とトップレベルの delay
、future
、lazy
を削除しました。If you want to keep using them, use the github:crystal-community/future.cr shard. Read more at #9093.
Another feature that was dropped is the parallel
macro in #9097.
1.0 以降に向けて、より堅牢で様々な利用に耐えうるもの開発したいと考えています。
ランタイム
Process#signal
があるので Process#kill
を非推奨としました。Read more at #9006.
また fork
も非推奨となりました。これはマルチスレッド環境では有効ではありません。この変更が問題である場合は、Process.fork
はまだ利用できるのでそちらを使ってください。しかし、このメソッドはもはや公開された API ではありません。Read more at #9136.
プラットフォーム
For macOS users, we fixed some compatibility issues with 10.15 (Catalina) in #9296.
For BSD users, we added support for DragonFly(BSD) in #9178.
For musl users, we fixed some weird segfaults in #9238 and fixed some empty backtraces #9267.
Windows ユーザーへはたくさんのお知らせがあります。To see the ongoing efforts don’t miss the wiki page and #5430.
今回のリリースでの Windows 向けの変更としては次のようなものがあります。
File
improvements #9015, #9038, #9037, #9257.IO
behaviour was aligned in #9207.Process
was implemented #9047, #9021, #9122, #9112, #9149, #9310crystal spec
command deals with Windows paths in #9234- そして、コンパイラ自身を Windows 上でブートストラップできるようになりました。#9054, #9062, #9095, #9106, #9307.
ですが、まだ標準ライブラリのすべての部分が Windows で利用できるというというわけではないことには注意してください。
ツール
主要な変更はドキュメントジェネレータで、バージョンピッカーをサポートするようになりました。外部に .json
ファイルを用意して、現在と過去のリリースを指定することでバージョンピッカーに反映できます。Read more at #8792, #9074, and #9254.
次のステップ
Crystal をアップデートしてください。そして、問題の報告を心待ちにしています。私たちは1.0.0に向けての開発を始めています。1.0.0-preX のようなリリースをして、最終的な調整を重ねていくでしょう。
ここ数回のリリースで修正が多かったことは認めます。ですが、不快感は最小になるように心掛けたつもりです。
すべての非推奨にした定義は1.0では削除される予定です。1.0をクリーンなバージョンにしたいと思っています。
We have been able to do all of this thanks to the continued support of 84codes, Nikola Motor Company and every other sponsor. 継続的に開発・メンテナンスを続けていくには、寄付が不可欠です。OpenCollective and Bountysource are two available channels for that. Crystal の直接のスポンサーになりたい場合や、他のサポート方法を探している場合は crystal@manas.tech に連絡してください。それでは、ここまで読んでいただきありがとうございます!
Crystal 0.35.0 has been released!
今回のリリースはみなさんの待ち望んでいた、1.0直前の標準ライブラリに磨きをかけるものです。この中には最近のいくつかの追加やより洗練された実装の繰り返しといった、多くの活動があります。他には、デバッグの改善や Windows のサポート、その他のプラットフォームでのランタイムの安定化などを含みます。
このリリースが最後のバージョン 0.x のリリースになるでしょう。1.0.0-preX のリリースに向けて準備をしていてください。
There are 242 commits since 0.34.0 by 38 contributors.
それでは今回のリリースのハイライトを紹介していきます。たくさんの紹介するものがあります。Don’t miss out on the rest of the release changelog which has a lot of valuable information.
言語の変更
網羅性チェック (テイク2)
前回のリリースで、コンパイラは case 文の条件節の網羅性チェックをするようになりました。ですが、フィーバックを受けて、次のことを決定しました。
case ... when
を前のように戻す。暗黙のelse nil
があって、条件節は網羅的でなくてもよい。case ... in
文を実験的に導入する。こちらは暗黙のelse
を持たず、条件の網羅性が確認できなければコンパイルが通らない。実験的というのはフォードバックを元に変更される可能性がある、ということです。たとえマイナーリリースの間でも、その変更は行なわれる可能性があります。この決定によって
case ... when
の意味は身近なままとなり、既存のコードに影響することなく網羅性チェックをする case 文を洗練させていくことが可能になります。Read more at #9258 and #9045.この変更によって
in
が正式なキーワードとなりました。これは破壊的な変更ですが、in
はこれまでもマクロ中ではキーワードとして扱われていました。コンパイラ
コンパイラに破壊的な変更があり、コンパイラの CLI がシバン
#!
によるスクリプトをより安心して動作させられるようになりました。これからは、コマンドの代わりにファイルを引数にしてコンパイラを実行すると (crystal path/to/file.cr arg1 arg2
のように)、ファイルがコンパイルされて、そしてそれを実行する、という動作をします。このとき、引数はプログラムにだけ影響して、コンパイラに影響しない、ということです。コンパイラフラグを使いたい場合や引数と共にプログラムを実行したい場合は、次のように run コマンドが使えます。
crystal run path/to/file.cr -Dcompiler_flag --release -- arg1 arg2
--
はコンパイラのオプションとプログラムのオプションを切り分けます。Read more at #9171.他の破壊的な変更としては、
crystal env
がシェル向けにクオートをするようになりました。つまり、eval "$(crystal env)"
が安全にできるようになったということです。また、crystal env VARIABLE
はこれまでの通りです。Read more at #9428パーサーはたくさんの愛を受けました。Fixing edge cases, bugs and even a considerable refactor in #9208.
言語のいくつかの機能はより良い動作のために反芻が必要でした。このリリースではオートキャストが多重ディスパッチやユニオンのデフォルト値に対して動作するようになりました。Read more at #9004 and #9366. これはいくつかの場合の予期しない残念な挙動を解決するでしょう。
既存の機能の改善の背景には、Crystal のデバッグ機能の改善を待ち望まれていたことがあります。The story is not yet complete, but in #8538 a huge step forward was made. You can check out an article about how to debug a Crystal program in VS Code article for more information, configuration and screenshots.
@[Link]
アノテーションは少しだけ再デザインされました。pkg-config とより統合されて、static:
オプションのサポートが無くなりました。これによって将来、デフォルト値をいい感じに提供しつつ、リンクを詳細に設定できるようにすることを見据えています。Read more at #8972.Crystal パッケージのメンテナにとって、コンパイラをビルドする際に
CRYSTAL_CONFIG_PATH
が標準ライブラリのパスのみを必要とするようになったという知らせは価値があるでしょう。lib
ディレクトリはコンパイラによって常に含まれるようになりました。将来的には shaeds のインストールパスを細かく設定できるようにしたいと考えています。Read more at #9315.その他の変更として、
SOURCE_DATE_EPOCH
という環境変数を使うことでコンパイラをビルドする際にソースコードの時刻を伝えることができるようになりました。Read more at #9088.Shards
Shards v0.11.1 が今回のリリースではバンドルされます。
今回の把握すべき主要な変更は
crystal:
プロパティが効果的に機能するようになった点です。このプロパティは、有効な shard のバージョンを Crystal 環境に基いて決定するのに使われます。You can check the semantics in shards/SPEC.md.後方互換性のために
crystal:
プロパティがshard.yml
に無かった場合、< 1.0.0
として解釈されます。よって、Crystal 1.0.0 まではそのままでも動作し続けるでしょう。また、この挙動が不便な場合は、--ignore-crystal-version
を渡すことでこのチェックを無視できます。利用者の期待を高めるには、依存するバージョンを明示する必要があると考えられます。そして、標準ライブラリや言語のバージョンもまた依存関係なのです。
crystal:
プロパティの動作は依存関係のバージョン指定とほとんど同じように動作します。違いは、利便性のためcrystal: x.y.z
が~> x.y, >= x.y.z
のように (つまり、>= x.y.z, < (x+1).0.0
) 解釈されることです。この結果、任意のメジャーリリースで何らかの対応が必要になります。shards install
を現在のプロジェクトで実行することを推奨します。これによって、shard.lock
がいくつかの追加の新しいバージョンのフォーマットを持つことに気付くかもしれません。そして、lib/.shards.info
ファイルがインストールした依存関係を説明するものとして追加されています。この新しいファイルはバージョン管理システムでトラックする必要はありません。最後に、依存関係のバージョン指定で
version: >= 1.0.0, < 2.0
のように複数の指定を交差させられるようになったことを紹介します。For a comprehensive list of changes in this shards version you can check its changelog.
標準ライブラリ
このリリースにはいくつもの破壊的変更が含まれます。それらの大半は普通、非推奨の警告が出るようになっています。標準ライブラリの整理なしに1.0へと進むことはないつもりです。このような整理は以前にもあったはずです。これに優先順位を付けることは簡単ではなく、地道に進めています。
計算結果の出力や入力に
IO
を引数に取る多くのメソッドがあります。In #5916 you can read the motivation to standardize them as the first argument in these functions. It got implemented in #9134 and some follow up PRs.Related to all these
IO
methods, onString
, instead of returningString
values, there are new overloads to emit directly the result to theIO
; read more in #9236. この影響を受けるのは#underscore
、#titleize
、#capitalize
、#upcase
、そして#downcase
といったメソッドです。その他の
IO
の破壊的な変更としては、#skip
、#write
、#write_utf8
、#write_byte
、#write_bytes
、や#skip_to_end
がスキップした/書き込んだバイト数の数値を返すようになったことがあります。これは他の言語でもそのようになっており、書き込み中に追加の呼び出しなく現在のストリームを位置を把握できるようになります。Read more at #9233 and #9363.@[Experimental]
アノテーションという、ライブラリや言語、shardの部分に細心の注意と共に使う必要のあるという指定をするためのものが導入されました。実験的な (experimental) 機能は変更や破壊、もしくは削除を Semver の規約に関わらず行なっても良いものとします。今のところ、アノテーションはドキュメントジェネレータで利用されています。ですが、他にも追加の機能のアイディアがあります。Read more at #9244.Digest
型がリファクタリングされて、いくつかのメソッドの名前が変更されたことに注意する必要があるかもしれません。Read more at #8426.さて、
OptionParser
がサブコマンドを定義できるようになりました。Read more at #9009.Some other clean-ups:
Flate
,Gzip
,Zip
, andZlib
were moved insideCompress
module in #8886. また、Flate
はCompress::Deflate
に名前が変更されています。require "compress/gzip"
として、これらの定数を変更する必要があります。require "gzip"
は依然として有効ですが、警告メッセージが表示されることになります。いくつかの変更が
File
とFileUtils
にあります。これらは整理されて、強制する操作が両方の API で有効になりました。Read more at #9175.マクロ
クロスコンパイルの際、
host_flag?
というマクロが追加されたことを知っておくと便利でしょう。これはflag?
のようなものですが、ホストのマシンで解決されます。Read more at #9049.数値計算
符号付きと符号無しの数値の混ざった演算のオーバーフローの検出が修正されました。Read more at #9403.
Int#digits
というメソッドが追加されて、一貫性のためBigInt#digits
の出力が反転されました。Read more at #9383.シリアライズ
The
JSON.mapping
andYAML.mapping
migrated to their own packages: github:crystal-lang/json_mapping.cr and github:crystal-lang/yaml_mapping.cr. これらの機能は十分なものでしたが、現在はJSON::Serializable
とYAML::Serializable
がより良いものとしてあるため、標準ライブラリから削除されました。Read more at #9272.時刻
これからは
Time#to_rfc3339
のデフォルトの精度は秒となり、それ以上の精度は出力されません。より細かな精度が必要な場合はfraction_digits
という名前付き引数に 0. 3, 6, 9 という精度の桁数を指定してください。In #9283 we are dropping the logic to show the fraction of seconds depending on the time value.ネットワーク
We’ve updated the SSL server secure defaults in #9026. And fixed some
HTTP::Server
sporadic failures during SSL handshake in #9177.そして、
HTTP::Server
に2つの破壊的な変更があります。We improved the error handling and logging in #9115 and integrated it with the new logging module. TheHTTP::Request#remote_address
type was changed toSocket::Address?
in #9210.ログ
まず初めに、0.34.0で導入した新しいログモジールを早期に試してフィードバックを送ってくださった皆様に感謝いたします。破壊的な変更を含むいくつかの変更点がありますが、それらは主要な API には影響しません。これらを組み合わせることで、追加の機能といくつかのユースケースでのパーフォマンスの改善を達成しています。
We renamed
Log::Severity::Warning
toWarn
in #9293.Log.warn { ... }
がありましたが、これはそのままで、警告を表します。。この変更は:warning
やほとんどの環境変数経由での設定に影響します。Similarly, we droppedVerbose
, and addedTrace
andNotice
in #9107.ログのセットアップがよりシンプルになりました。
Log.setup*
系の2つのメソッドがあります。これらのメソッドは常にソースとバックエンドの間のバインディングを完全に設定するでしょう。Log.setup_from_env
が1つの環境変数を受け取って動作するようになったことにも注意してください。より柔軟なものが今後追加されるかもしれませんが、名前付き引数はより良い体験を提供するはずです。Read more at #9145.各エントリはこれまでより、現在実行しているファイバーから取得したコンテキストの情報を持っていました。その
Log::Context
の責務をLog::Metadata
とLog::Metadata::Value
に分割することにしました。前者はSymbol
からLog::Metadata::Value
へのハッシュのようなデータ構造ですが、アロケーションやアルゴリズム的な最適化がされています。The main work was done in #9227 and #9295. これらのリファクタリングによって、クローンによって獲得していたLog::Metadata::Value
の不変性 (immutability) が無くなりました。ログエントリにローカルのメタデータや構造化された情報を追加したいという機能が望まれていました。もちろん、現在のファイバのコンテキストに対する変更や復旧が最小であるものが望ましいです。エントリが出力されていない場合は値の生成を省略するという当初の設計を保って、これを達成しました。
How to create custom log formatters was revisited in #9211. ブロックや Proc からフォーマッタを作る方法はまだ利用できますが、文字列から直接フォーマッタを定義するシンプルな方法を確認してみてください。
出力するログのエントリーをテストしたい場合、新しく追加された
Log.capture
というヘルパーが利用できます。Read more at #9201.並行処理
Concurrent::Future
とトップレベルのdelay
、future
、lazy
を削除しました。If you want to keep using them, use the github:crystal-community/future.cr shard. Read more at #9093.Another feature that was dropped is the
parallel
macro in #9097.1.0 以降に向けて、より堅牢で様々な利用に耐えうるもの開発したいと考えています。
ランタイム
Process#signal
があるのでProcess#kill
を非推奨としました。Read more at #9006.また
fork
も非推奨となりました。これはマルチスレッド環境では有効ではありません。この変更が問題である場合は、Process.fork
はまだ利用できるのでそちらを使ってください。しかし、このメソッドはもはや公開された API ではありません。Read more at #9136.プラットフォーム
For macOS users, we fixed some compatibility issues with 10.15 (Catalina) in #9296.
For BSD users, we added support for DragonFly(BSD) in #9178.
For musl users, we fixed some weird segfaults in #9238 and fixed some empty backtraces #9267.
Windows ユーザーへはたくさんのお知らせがあります。To see the ongoing efforts don’t miss the wiki page and #5430.
今回のリリースでの Windows 向けの変更としては次のようなものがあります。
File
improvements #9015, #9038, #9037, #9257.IO
behaviour was aligned in #9207.Process
was implemented #9047, #9021, #9122, #9112, #9149, #9310crystal spec
command deals with Windows paths in #9234ですが、まだ標準ライブラリのすべての部分が Windows で利用できるというというわけではないことには注意してください。
ツール
主要な変更はドキュメントジェネレータで、バージョンピッカーをサポートするようになりました。外部に
.json
ファイルを用意して、現在と過去のリリースを指定することでバージョンピッカーに反映できます。Read more at #8792, #9074, and #9254.次のステップ
Crystal をアップデートしてください。そして、問題の報告を心待ちにしています。私たちは1.0.0に向けての開発を始めています。1.0.0-preX のようなリリースをして、最終的な調整を重ねていくでしょう。
ここ数回のリリースで修正が多かったことは認めます。ですが、不快感は最小になるように心掛けたつもりです。
すべての非推奨にした定義は1.0では削除される予定です。1.0をクリーンなバージョンにしたいと思っています。
We have been able to do all of this thanks to the continued support of 84codes, Nikola Motor Company and every other sponsor. 継続的に開発・メンテナンスを続けていくには、寄付が不可欠です。OpenCollective and Bountysource are two available channels for that. Crystal の直接のスポンサーになりたい場合や、他のサポート方法を探している場合は crystal@manas.tech に連絡してください。それでは、ここまで読んでいただきありがとうございます!