[ODC]External LogicをVisual Studio Codeで作成する

[ODCでC#を取り込んでみる（External Logic）](https://qiita.com/jyunji_watanabe/items/2698fb5a80b857875a48)ではVisual StudioでExternal Logicを作成する手順を確認した。ここでは、無償で使えるVisual Studio Codeでの作成手順を確認する。

基本的な情報は↑の記事にまとめてあるので、Visual Studio Codeの場合の差分のみを書く。
（見直したら、コマンドでプロジェクトを作る手順になってしまっているが、この手順で作ったプロジェクトはそのままVisual Studio Codeでの開発に使える）

# 変更履歴
2024/01/20 テストプロジェクトを追加することも考えてソリューションフォルダの下にプロジェクトフォルダを配置するように変更
2024/11/26 .NET 6がEOSになるので、.NET 8用のコマンドリストを追加

# 環境情報
OutSystemsExternalLibraries.SDK.1.4.0
.NET SDK 6.0
Visual Studio Code (Version 1.85.1) 
Windows 11 Home

# External Logicは、VSCodeをサポートしているか？
[外部ライブラリSDKのREADME](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/building_apps/extend_your_apps_with_external_logic_using_custom_code/external_libraries_sdk_readme/)によると、前提条件の項で、

> .NET 6プロジェクトの作成をサポートするIDE。Visual Studio、Visual Studio Code、Jet Brains Riderなど。

という記載があるので、Visual Studio Codeで開発することについて特に問題は無さそう。

ただし、[OutSystemsのシステム要件（ODC向け）](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/getting_started_with_odc/outsystems_system_requirements_for_odc/)にはVisual Studio Codeの記載は無い。External Logicの記載そのものが現時点（2024/01/19) では無いので、まだExternal Logicについての記述が反映されていないだけかな。

# コマンドサマリ（.NET 8用。基本的にこっちを使う）
ソリューション=QiitaSamples
プロジェクト=ExternalLogicExample1
の場合の例なので、適宜読み替えて使う。

```
dotnet new sln -o QiitaSamples
cd .\QiitaSamples\
dotnet new classlib -o ExternalLogicExample1 --framework net8.0
dotnet sln add .\ExternalLogicExample1\ExternalLogicExample1.csproj
cd .\ExternalLogicExample1\
dotnet add package OutSystems.ExternalLibraries.SDK
```

# コマンドサマリ（.NET 6用なので非推奨）
ソリューション=QiitaSamples
プロジェクト=ExternalLogicExample1
の場合の例なので、適宜読み替えて使う。

```
dotnet new sln -o QiitaSamples
cd .\QiitaSamples\
dotnet new classlib -o ExternalLogicExample1 --framework net6.0
dotnet sln add .\ExternalLogicExample1\ExternalLogicExample1.csproj
cd .\ExternalLogicExample1\
dotnet add package OutSystems.ExternalLibraries.SDK
```

# 操作後のフォルダ構成とプロジェクトファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/68e3394b-7279-8242-7058-d259b1cffd1f.png)

``` cs
<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>

</Project>
```

# ソリューション作成
Visual Studio Codeを起動して、Terminalを開く（キーボードショートカット：Ctrl + @）。
dotnet newでTEMPLATEにslnを指定することで、ソリューションファイルを含むフォルダを作成する。
```
PS C:\work\test> dotnet new sln -o QiitaSamples
テンプレート "ソリューション ファイル" が正常に作成されました。

PS C:\work\test> cd .\QiitaSamples\
PS C:\work\test\QiitaSamples> dir

    Directory: C:\work\test\QiitaSamples

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2024/01/20    15:03            441 QiitaSamples.sln
```

# プロジェクト作成
ソリューションフォルダ（QiitaSamples) で、Class Libraryプロジェクトを作成する（名前はExternalLogicExample1とした）。
```
PS C:\work\test\QiitaSamples> dotnet new classlib -o ExternalLogicExample1 --framework net6.0
テンプレート "クラス ライブラリ" が正常に作成されました。

作成後の操作を処理しています...
C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj を復元しています:
  復元対象のプロジェクトを決定しています...
  C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj を復元しました (121 ms)。
正常に復元されました。


PS C:\work\test\QiitaSamples> dir .\ExternalLogicExample1\

    Directory: C:\work\test\QiitaSamples\ExternalLogicExample1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/01/20    15:13                obj
-a---          2024/01/20    15:13             66 Class1.cs
-a---          2024/01/20    15:13            215 ExternalLogicExample1.csproj
```
テストしたコンピュータに複数バージョンの.NETが入っていて、違うバージョンのプロジェクトができため、「--framework net6.0」のオプションを追加してバージョンを指定した。

続いて、ソリューションにプロジェクトを追加する。

```
PS C:\work\test\QiitaSamples> dotnet sln add .\ExternalLogicExample1\ExternalLogicExample1.csproj
プロジェクト `ExternalLogicExample1\ExternalLogicExample1.csproj` をソリューションに追加しました。
```

これで、slnファイルにプロジェクトファイルへの参照が追加された。

# External LibraryのSDKをプロジェクトに追加する
```
PS C:\work\test\QiitaSamples> cd .\ExternalLogicExample1\
PS C:\work\test\QiitaSamples\ExternalLogicExample1> dotnet add package OutSystems.ExternalLibraries.SDK                         
  復元対象のプロジェクトを決定しています...
  Writing C:\Users\test\AppData\Local\Temp\tmp1419.tmp
info : X.509 certificate chain validation will use the default trust store selected by .NET for code signing.
info : X.509 certificate chain validation will use the default trust store selected by .NET for timestamping.
info : パッケージ 'OutSystems.ExternalLibraries.SDK' の PackageReference をプロジェクト 'C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj' に追加しています。
info :   GET https://api.nuget.org/v3/registration5-gz-semver2/outsystems.externallibraries.sdk/index.json
info :   OK https://api.nuget.org/v3/registration5-gz-semver2/outsystems.externallibraries.sdk/index.json 621 ミリ秒
info : C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj のパッケージを復元しています...
info : パッケージ 'OutSystems.ExternalLibraries.SDK' は、プロジェクト 'C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj' のすべての指定されたフレームワークとの互換性があります。
info : ファイル 'C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj' に追加されたパッケージ 'OutSystems.ExternalLibraries.SDK' バージョン '1.4.0' の PackageReference。
info : アセット ファイルをディスクに書き込んでいます。パス: C:\work\test\QiitaSamples\ExternalLogicExample1\obj\project.assets.json
log  : C:\work\test\QiitaSamples\ExternalLogicExample1\ExternalLogicExample1.csproj を復元しました (157 ms)。
```

# 作成したソリューションをVSCodeで開く。
```
PS C:\work\test\QiitaSamples\ExternalLogicExample1> cd ..
PS C:\work\test\QiitaSamples> code --reuse-window .      
```

# 以降の手順はVisual Studioの場合と同じ
## zip作成
Visual Studioで作った時と同じコマンドでよかった。実行時はプロジェクトフォルダ。
```
PS C:\work\test\QiitaSamples\ExternalLogicExample1> dotnet publish -c Release -r linux-x64 --self-contained false
MSBuild のバージョン 17.7.3+8ec440e68 (.NET)
  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
  ExternalLogicExample1 -> C:\work\test\QiitaSamples\ExternalLogicExample1\bin\Release\net6.0\linux-x64\ExternalLogicExample1.dll
  ExternalLogicExample1 -> C:\work\test\QiitaSamples\ExternalLogicExample1\bin\Release\net6.0\linux-x64\publish\
```

## 参考リンク
手順については
[ODCでC#を取り込んでみる（External Logic）](https://qiita.com/jyunji_watanabe/items/2698fb5a80b857875a48)

SDKが提供する属性のいくつかについては
[External Logicの属性いろいろ](https://qiita.com/jyunji_watanabe/items/3fd711513c8e8231853f)

を参照。