ReactiveProperty v7.0.0 をリリースしました

ゴールデンウィークなので、今まで気になってたところを整備したりしました。

GitHub Actions で NuGet へのリリースまで行うようにしました。master ブランチはビルド・テスト・NuGet パッケージをアーカイブに保存、pre-release ブランチに push すると master ブランチでの作業に加えて NuGet にプレビュー版としてリリース、release ブランチに push するとリリース版を NuGet に公開します。

GitHub Actions 使ってて思ったのが、tag を使った方が素直に色々出来そうだな…と思いました。GitHub のリリース作成とかでは tag 使うのが前提っぽいし。タグ名をそのままリリースの名前に使うのが自然な流れみたいなので、tag を使わない運用の今回は GitHub のリリース作成は手動のままにしてます。


## 変更点

NuGet パッケージを以下のように分割しました。特に理由がなければ、今まで通り ReactiveProperty パッケージを参照に追加してください。WPF, UWP, Xamarin など固有機能が必要な場合は、そちらのパッケージを利用してください。

ReactiveProperty.Core は ReactiveProperty みたいなクラスが欲しいけど Rx の機能は不要なんだよな…と思っている方向けで Reactive Extensions への依存を取り除いた ReactivePropertySlim と ReadOnlyReactivePropertySlim が含まれている最小限のパッケージになります。

|Package Id|Version and downloads|Description|
|----|----|----|
|[ReactiveProperty](https://www.nuget.org/packages/ReactiveProperty/)|![](https://img.shields.io/nuget/v/ReactiveProperty.svg)![](https://img.shields.io/nuget/dt/ReactiveProperty.svg)|基本的な機能を含んでいます。|
|[ReactiveProperty.Core](https://www.nuget.org/packages/ReactiveProperty.Core/)|![](https://img.shields.io/nuget/v/ReactiveProperty.Core.svg)![](https://img.shields.io/nuget/dt/ReactiveProperty.Core.svg)|ReactivePropertySlim と ReadOnlyReactivePropertySlim が含まれています。Reactive Extensions への依存がないので、本当にシンプルな変更通知機能だけを持った ReactiveProperty が欲しい場合に利用してください。|
|[ReactiveProperty.WPF](https://www.nuget.org/packages/ReactiveProperty.WPF/)|![](https://img.shields.io/nuget/v/ReactiveProperty.WPF.svg)![](https://img.shields.io/nuget/dt/ReactiveProperty.WPF.svg)|WPF (.NET Core と .NET Framework 両対応) 向けの EventToReactiveProperty と EventToReactiveCommand が含まれています。|
|[ReactiveProperty.UWP](https://www.nuget.org/packages/ReactiveProperty.UWP/)|![](https://img.shields.io/nuget/v/ReactiveProperty.UWP.svg)![](https://img.shields.io/nuget/dt/ReactiveProperty.UWP.svg)|UWP 向けの EventToReactiveProperty と EventToReactiveCommand が含まれています。|
|[ReactiveProperty.XamarinAndroid](https://www.nuget.org/packages/ReactiveProperty.XamarinAndroid/)|![](https://img.shields.io/nuget/v/ReactiveProperty.XamarinAndroid.svg)![](https://img.shields.io/nuget/dt/ReactiveProperty.XamarinAndroid.svg)|Xamarin.Android 向けのネイティブコントロールのイベントを IObservable に変換したりする拡張メソッドが含まれています。|
|[ReactiveProperty.XamariniOS](https://www.nuget.org/packages/ReactiveProperty.XamariniOS/)|![](https://img.shields.io/nuget/v/ReactiveProperty.XamariniOS.svg)![](https://img.shields.io/nuget/dt/ReactiveProperty.XamariniOS.svg)|Xamarin.iOS のネイティブコントロールと ReactiveProperty や ReactiveCommand をバインドするための拡張メソッドが含まれています。|

## 機能追加

- ReactiveProperty のバリデーションエラーメッセージを監視するための `ObserveValidationErrorMessage` 拡張メソッドを追加しました。以下のように使えます。

```csharp
// バリデーションが追加されている ReactiveProperty<T> 型の MyProp のバリデーションエラーメッセージを ReadOnlyReactiveProperty にするコード
ReadOnlyReactiveProperty<string> MyPropErrorMessage = MyProp.ObserveValidationErrorMessage()
  .ToReadOnlyReactiveProperty();
```

## 性能改善

ReactiveProperty と ReadOnlyReactiveProperty に ReactivePropertySlim と ReadOnlyReactivePropertySlim のコードを一部インポートしました。これにより ReactiveProperty と ReadOnlyReactiveProperty の性能が 4 割くらい改善されています。

ただ、これでも Slim のついているクラスのほうが桁違いに早いです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ReactiveProperty v7 だけど ReactiveProperty&lt;T&gt; と ReadOnlyReactiveProperty&lt;T&gt; のパフォーマンス改善も入れてみました。ただ、Slimのほうが圧倒的に早いけど…<br>4割くらい早くなってるのかな。 <a href="https://t.co/pCHRuqP0Ic">pic.twitter.com/pCHRuqP0Ic</a></p>&mdash; かずき(Kazuki Ota) (@okazuki) <a href="https://twitter.com/okazuki/status/1256948157893578752?ref_src=twsrc%5Etfw">May 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## まとめ

GitHub のリリースを作らないと…。後でやろう。