[ODC].pdbと.deps.jsonファイルをExternal Logicに含めるか？

ODCにC#コードを取り込むExcternal Logicをビルドすると、生成されるファイルが数種類ある。
生成されたファイルをzipにまとめてアップロードするわけだが、拡張子.pdbと.deps.jsonのファイルは一見して必要性が分かりにくいので、それぞれ何を指すのか、省いて大丈夫なのかを確認していく。

ビルドが何を指すか、は以下の記事のPublishの項を参照。

https://qiita.com/jyunji_watanabe/items/2698fb5a80b857875a48#publish

# Publishで生成されたフォルダにある拡張子.pdbと.deps.jsonのファイル
External Logic用のProjectをPublishすると、以下のようなファイル群が出力される。これをzipファイルにまとめて、ODC Portalにアップロードすると、ODC上のActionとして利用できるようになる。

拡張子dllのファイルは当然zipファイルに含めるのだが、拡張子.pdbと.deps.jsonのファイルはどうだろうか、というのを確認しておきたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0bb5326c-d6e2-4611-a9fa-f1f264f8f7f5.png)

# 結論
- .pdbファイル　→ 含めなくて良い
    - 含める　→ エラー発生時に、ODC Portalのログ > Stackにエラー発生箇所（ファイル名と行番号）が出る
    - 含めない　→ ↑の情報が出ない。ちょっとzipファイルのサイズが小さくなる
- .deps.jsonファイル　→ 一応含めておく

# .pdbファイル
## MSのドキュメントより
https://learn.microsoft.com/ja-jp/dotnet/core/diagnostics/symbols

（2025/06/13確認。太字は引用時につけた）

> PDB ファイルは、**コンパイラによって生成される補助ファイルであり、他のツール (特にデバッガー) に、メインの実行可能ファイルの内容、およびその生成方法に関する情報を提供します。** たとえば、デバッガーによって PDB が読み取られ、foo.cs の 12 行目が実行可能ファイルの適切な場所にマップされて、ブレークポイントを設定できるようになります。

主にデバッグを目的とした情報提供用ファイル。
つまり実行時には不要そう。

## 動作確認
zipファイル作成時に、拡張子がpdbのファイルを除いて圧縮する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/59bea420-8a1e-438c-831b-cc2e23facb53.png)

このzipファイルをアップロードし、テスト用Appの参照を更新して実行してみると、問題なく実行できた。
やはり、.pdbファイルは実行に必須ではなさそう。

## 例外を発生させてODC Portalのエラーログを確認
External Logicのデバッグ情報がODCにどう影響するかを考えると、例外発生時に記録されるエラーログが思いつく。
そこで、External Logicで例外を発生させてみた。

ODC Portalでエラーログを表示してみると、Stackに明らかな違いがあった。
以下、該当部分のみを抜粋する。
.pdbファイルを含めておくと、エラーが発生した場所（ファイルと行番号）を表示してくれる。

``` :pdbファイルを含めた場合
   at ExcelService.WriteCell(Byte[] excelFile, String sheetName, String cellAddress, String value) in /Users/junji/VSCode/DeveloperDayTokyo2025/DeveloperDayTokyo2025/ExcelService.cs:line 10
```

``` :pdbファイルを含めなかった場合
   at ExcelService.WriteCell(Byte[] excelFile, String sheetName, String cellAddress, String value)
```

## 本番運用時に.pdbファイルを含めても問題ないか？
一般的な.NET開発であれば、例外補足を失敗して、外部に例外の生情報が出てしまえば問題。しかし、ODCのExternal Logicの場合、例外そのものはODCのプラットフォームが補足するので生の例外情報は露出しない。

もちろん例外メッセージはODCのExceptionが持つExceptionMessageにあるので補足しないとこれは露出してしまう。しかし、これは.pdbファイルを含めるかどうかに関わりなく露出してしまうので、.pdbファイルを含めることによる追加のリスクにはならない。

よって、External Logicの.zipファイルには.pdbファイルを含めてしまっても実害はなさそう。

# .deps.jsonファイル
## ドキュメントより
まず、External Logicは（今のところ）AWS Lambdaで動作するので、その.NET関係のドキュメント。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/csharp-package.html

> .NET デプロイパッケージ (.zip ファイルアーカイブ) は、関数のコンパイル済みアセンブリと、そのアセンブリのすべての依存関係で構成されています。このパッケージには、proj.deps.json ファイルも含まれています。これは、関数のすべての依存関係と、.NET ランタイムを設定するために使用される proj.runtimeconfig.json ファイルを、.NET ランタイムに伝達します。

（2025/06/14確認）
.deps.jsonファイルはデプロイパッケージに含まれる、ということからこの拡張子のファイルは必要そうではある。
また、役割としては、パッケージ内の依存関係をランタイムが知るため、ということのようだ。

こちらはMSのドキュメント。.deps.jsonがない場合、アプリケーションのディレクトリに依存関係が全て含まれる、という前提で動く（つまりアプリケーションフォルダに必要なライブラリを置いておけば動く？）ようだ（.NETの仕組みについてのドキュメントの一部を拾い読みしただけなので、その点に注意）。

https://learn.microsoft.com/ja-jp/dotnet/core/dependency-loading/default-probing

（2025/06/14確認。太字は引用時につけた）

> - .deps.json ファイルが存在する場合は、ファイルが解析されてプローブ プロパティが設定されます。
> - .deps.json ファイルが **存在しない場合、アプリケーションのディレクトリに、すべての依存関係が含まれていると見なされます。** ディレクトリの内容が、プローブ プロパティを設定するために使用されます。

## 動作確認
zipファイル作成時に、拡張子が.deps.jsonのファイルを除いて圧縮する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b10b5d69-8a1c-420b-a658-5f967d44f519.png)

このzipファイルをアップロードし、テスト用Appの参照を更新して実行してみると、問題なく実行できた。

というわけで、.deps.jsonは含めなくても動くが、ドキュメントを見る限りは念のため含めておいた方がよさそう。

# zipファイルにはサイズ制限がある点には注意
今の.NETで作るPortable PDBという形式は以前のPDBより小さいようだが、External Logicアップロード用のzipファイルにはサイズ制限（90MB）がある点に注意。ファイルサイズがぎりぎりの時は、.pdbファイルを含めない方が良いかもしれない。

https://success.outsystems.com/documentation/outsystems_developer_cloud/building_apps/extend_your_apps_with_custom_code/#upload-external-logic

> 2\. Click the Upload file button to browse for the ZIP file or drag and drop it to the labeled area. **The ZIP file must be less than 90MB.** Then click Continue.

（2025/06/14確認。太字は引用時につけた）