パッケージ定義ファイルの要素

古くはビルドするための定義として下記のようなものがあります。

- **Make** の `Makefile`
- **Ant** の `build.xml`
- **Gradle** の `build.gradle`
- **Maven** の `pom.xml`
- **Visual Studio** の `*.vcxproj`、`*.csproj`

現代ではビルドというよりは**パッケージを管理するため**に「**パッケージ定義ファイル**」を作るように変わってきています。
多くの言語や環境において、パッケージを公開するためのホームページ（レポジトリー）が１つあり、ここに公開するためには次のようなパッケージファイルを作ることになります。

- **Dart** における **[pub.dev](https://pub.dev/)** の `pubspec.yaml`
- **Lua** における **[LuaRocks](https://luarocks.org/)** の `Rockspeck`
- **Node.js** における **[npm](https://www.npmjs.com/)** の `package.json`
- **Python** における **[PyPl](https://pypi.org/)** (pip) の `setup.py`、`__init__.py`、`__main__.py`
- **Rust** における **[create.io](https://crates.io/)** (cargo) の `package.toml`
- **Ruby** における **[RubyGems](https://rubygems.org/)** の `gemspec`
- **Swift** における **Swift Package Manager** (SwiftPM) の `Package.swift`

サードパーティ製としても以下のようなものもあります。

- **CocoaPods** の `*.podspec`
- **Carthage** の `Cartfile`
- **[Libraries.io](https://libraries.io/)** （他のいろんなパッケージ管理を取り込む形）
- **Linux** の **[Snapcraft](https://snapcraft.io/)** の `snapcraft.yaml`

# パッケージ管理レポジトリーの役割

パッケージが公開され、それが管理されていると次のような利点があります。

- 公開されているパッケージを検索できる。
    - このため、各開発環境があらかじめ用意している標準ライブラリ以外を「あたかも公式のライブラリ」のように扱うことができる（実質的な審査は皆無だけれど）。
    - 使用者のコメントや、ダウンロード数、評価数などを用意しているレポジトリーも多い。
- パッケージのバージョン管理ができる。
    - バージョンアップされた際に、使用者にバージョンアップを促せる。
    - 開発時に使用していたバージョンに固定させる設定を有するシステムもある。

# パッケージ定義ファイルの内容

レポジトリーに登録する際には、いくつか決まり事がありますが、
代表するファイルにいくつかの情報を記入します。

## 使う人向けの情報
まず使う人向けの情報として、下記の情報があります。

| 要素 | 例 | 説明 |
| --- | --- | --- |
| **ID** | `com.example.asoft` | パッケージを識別するための ID |
| **Name** | `Awesome Software` | パッケージの名称。１６文字以内程度。`Title` ということも。 |
| **Descriptioin** | `C library for each and every platform` | パッケージの説明。４０文字以内程度。より詳しい説明は `README.md` で説明。 |
| **Version** | `1.0` | 現在のバージョン。 |
| **Homepage** | `https://www.example.com/` | パッケージのホームページ |
| **Licenses** | `proprietary` | パッケージのライセンス |
| **Author** | `Example Author` | パッケージの開発組織 |
| **Contributors** | `Example` | パッケージへの寄稿者 |
| **Docs** | `README.md` | ドキュメントへのリンク |
| **Category** | `Middleware` | パッケージ製品の種類。ネット、ファイルシステム、といったもの |
| **Icon** | `example.ico` | アイコン |
| **Deprecated** | `N/A` | 廃止予定であり、他のパッケージに移行すべきことを示す |
| **TAG** | `Audio, Compression` | パッケージの種類を示すタグ |

## 作る人向けの情報
次に作る人向けの情報として、下記のような情報があります。

| 要素 | 例 | 説明 |
| --- | --- | --- |
| **Import Dependency** | `N/A` | 他のパッケージを取り込むことを意味する |
| **Dev Dependency** | `Platform SDK` | 他のパッケージに依存していることだけを示し、内包しない |
| **Runtime Dependency** | `VC2019 Runtime` | 実行時のパッケージ依存 |
| **DevEnv Dependency** | `CMake` | OS や言語への依存性を示す |
| **Language** | `C` | 使用するプログラミング言語 |


## パッケージ定義ファイルの内容

パッケージをレポジトリーに登録する際にも用いるファイルを「パッケージ定義ファイル」と勝手に読んでいますが、
各種システムで登録するファイル名やその形式、情報源となる URL を下記にまとめます。

| システム | 公式レポジトリー | パッケージ定義ファイル名 | ファイル形式 | 情報源 |
| --- | --- | --- | --- | --- |
| Dart | https://pub.dev/ | pubspec.yaml | YAML | https://dart.dev/tools/pub/pubspec |
| Lua | https://luarocks.org/ | rockspec | | https://github.com/luarocks/luarocks/wiki/Rockspec-format |
| Node.js | https://www.npmjs.com/ | package.json | JSON | https://docs.npmjs.com/files/package.json |
| Python | https://pypi.org/ | setup.py | Python | https://packaging.python.org/tutorials/packaging-projects/ |
| Rust | https://crates.io/ | package.toml | TOML | https://doc.rust-lang.org/cargo/reference/manifest.html |
| Ruby | https://rubygems.org/ | gemspec | Ruby | https://guides.rubygems.org/specification-reference/ |
| Swift | N/A | Package.swift | Swift | https://developer.apple.com/documentation/swift_packages/package |
| CocoaPods | N/A | *.podspec | Ruby | https://guides.cocoapods.org/syntax/podspec.html |
| Carthage | N/A | Cartfile | OGDL | https://github.com/Carthage/Carthage |
| Snapcraft | https://snapcraft.io/ | snapcraft.yaml | YAML | https://snapcraft.io/docs/snapcraft-yaml-reference |

| システム | 公式レポジトリー | パッケージ定義ファイル名 | ファイル形式 | 情報源 |
| --- | --- | --- | --- | --- |
| Apple App | https://www.apple.com/jp/app-store/ | info.plist | XML | https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html |
| CMake |  |  | 独自 | https://cmake.org/cmake/help/latest/ |
| Make | N/A | Makefile | 独自 | https://www.gnu.org/software/make/manual/make.html |
| Ant | N/A | build.xml | XML | http://ant.apache.org/manual/using.html |
| Gradle | N/A | build.gradle | Groovy | https://docs.gradle.org/current/userguide/tutorial_using_tasks.html |
| Maven | N/A | pom.xml | XML | https://maven.apache.org/pom.html |
| MSIX | N/A | appxmanifest.xml | XML |  |
| Visual Studio | N/A | *.vcxproj | XML | https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-project-file-schema-reference |
| Visual Studio Code | https://marketplace.visualstudio.com/vscode | package.json | JSON | https://code.visualstudio.com/api/references/extension-manifest |
| Windows Store App | https://www.microsoft.com/ja-jp/store/apps/windows |  |  |  |
| Winget | https://github.com/microsoft/winget-pkgs |  |  | https://github.com/microsoft/winget-cli/blob/master/doc/ManifestSpecv1.0.md |