[ODC]External Logicの.NETを6から8に上げる手順を読む

ODCでC#を利用する仕組みである、External Logicはリリース当初は.NET 6を対象としていた。
しかし、.NET 6のサポートが終了してしまうため、.NET 8にアップデートが必要。
その手順がドキュメントとして公開されていたので、関連情報と合わせて読んでいく。

# 環境情報
ODC Studio (Version 1.4.28)

手順は、MacBook Air M2 2022上のVSCodeで確認。
（NuGet Package ManagerはC# Dev KitというExtensionの一部のようなので、コマンドパレットで出てこなかったら、C# Dev Kitをインストール）

# 対象ドキュメント
[Upgrading custom code libraries to .NET 8 - ODC Documentation](https://success.outsystems.com/documentation/outsystems_developer_cloud/building_apps/extend_your_apps_with_external_logic_using_custom_code/upgrading_custom_code_libraries_to_net_8/)

# .NET 6のサポート停止予定は2024/12/20
フォーラムにOutSystemsスタッフからの言及があった。
[External Logic now supports .NET 8 | OutSystems](https://www.outsystems.com/forums/discussion/98512/external-logic-now-supports-net-8/)

> By the end of the year (December 20, 2024), we will stop supporting External Logic based on the .NET 6 Runtime. 

この日を過ぎても動かなくなるわけではないが、「.NET 6を使ったExternal LogicのアップロードやReleaseはできなくなる」とのこと。

当然ながら、.NET 6を使うのはサポート対象外になるため、基本的にアップデートすることになる。
また、この状況で新しいExternal Logicを.NET 6で作っても、問題を増やすだけなので、新しいプロジェクトなら基本的に.NET 8で作成する。

# 警告表示
現時点で、ODC Portal > External logicページで、.NET 6を使って作られたものは、Runtime version列に警告のアイコンが表示されるようになっている。
![スクリーンショット 2024-10-26 0.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ad6fa5ad-7bf9-efa7-59fd-ae1cc780d4b6.png)

アイコンにマウスオーバーすると、「This library is using a runtime version that will be discontinued on Dec 20, 2024.」と表示される（廃止予定のバージョンを使っているという警告）。

# アップデートを試す前に：自動テストがある場合は動作確認として実行しておく
自動テスト作成済みであれば、アップデート前後でテストを実行することで、回帰テストとすることができる。

C#コードとしてのテストなら、xunitなどを使ったユニットテスト

https://qiita.com/jyunji_watanabe/items/1ad31b47e55e11ab815b

OutSystemsのActionとしてのテストなら、BDDFrameworkを使ったテスト

https://qiita.com/jyunji_watanabe/items/35cf1500b64429e0e518

今回、手元でアップデートしようとしているExternal Logicに対しては、以前BDDFrameworkのテストを作成済みだったのでこれを実行しておいた。

# アップデート手順を試す
## Identify .NET 6: .NET 6で作られたExternal Libraryを特定する
これは、↑で書いたように、ODC Portalの一覧画面でチェックするのが簡単。

## Upgrade to .NET 8: .NET 8にアップグレード
### .NET 8 SDKをインストール
[Download .NET 8.0 (Linux, macOS, and Windows)](https://dotnet.microsoft.com/en-us/download/dotnet/8.0)から.NET 8のSDKをダウンロードしてインストールする。

インストールが終わったら、念のため以下のコマンドで確認。

```
dotnet --list-sdks    
8.0.403 [/usr/local/share/dotnet/sdk]
```

### プロジェクトファイルを書き換えてバージョンアップ

``` プロジェクトファイル(抜粋）：.csproj 
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="OutSystems.ExternalLibraries.SDK" Version="1.4.0" />
  </ItemGroup>
```

Target Frameworkを書き換える（net6.0 -> net8.0）。

### ライブラリのバージョン更新
VSCodeのコマンドパレットで「NuGet: Update NuGet Package」と入力。出てきたオプションから「NuGet: Update NuGet Package」を選択。
![スクリーンショット 2024-10-27 22.54.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/637dff24-f05c-e625-ed3b-58b0ba79db7c.png)

参照しているライブラリが出てくる。少なくとも、OutSystems.ExternalLibraries.SDKは必ず使っているのでこれを選択。他のライブラリを使っているプロジェクトなら、個別に更新の必要性を判断する。
![スクリーンショット 2024-10-27 22.56.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/84436ad0-cc87-db5f-7ba7-ddddb3883ef8.png)

新しいバージョンが出ていたら更新を検討（今回は最新の、1.5.0を選択。External Library機能が当初リリースされた時は、1.4.0を使っていたので更新になる）。
![スクリーンショット 2024-10-27 22.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/adb1fa4a-6c2f-d17c-8470-d12615c14a51.png)

.csprojファイルの参照バージョンが更新される。

## Release the new version of the library: ODCにアップロード > Release Libraryする
この部分の手順はこれまでと変わらない。

以下のコマンドをターミナルから入力し、

```
dotnet publish -c Release -r linux-x64 --self-contained false
```

<プロジェクト>/Release/net8.0/linux-x64/publishにできているファイルをzip圧縮して、ODC Portal > External logicメニュー > .NET 6時に登録済みのLibraryを選択 > Upload new revisionボタンから、作成したzipファイルをアップロードする。
External LibraryはLibraryの一種なので、アップロードが終わったら、Releaseを忘れずに。

詳細は以下を参照。

https://qiita.com/jyunji_watanabe/items/2698fb5a80b857875a48#odc%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89

Runtime versionが.NET 8.0に更新されたことを確認する。
![スクリーンショット 2024-10-27 23.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/94ac7387-ad71-c875-2167-5ba42a1354c5.png)

# 回帰テストを実施する
今回は自動テストがあるので、テストAppの参照を更新し、テストScreenを開き直し、全テストが成功していることを確認して終わり。