©️

モノリポ構成のプロジェクトにライセンス表示を試みた話

2023/12/22に公開

はじめに

社内でチーム開発を行うイベントがあり、そこでモノリポで Next.js (Frontend) と Nest (Backend) を扱うという構成で開発をすることになりました。

完成したものは OSS で公開したいという話も出ており、それにあたってライセンスを表記する必要が出てきたのでチームメンバーの知見と ChatGPT の意見を参考に、不明点を解消しながら取り組みました。

モノリポ構成ではライセンス表記はどうなるのか

一般的なアプローチとして以下の候補が挙がりました。

  • リポジトリ内のすべてのプロジェクトに同じライセンスを適用する
  • リポジトリ内の各プロジェクトに個別のライセンスを適用する
  • リポジトリ内の共通コンポーネントには共通のライセンスを、特定のディレクトリには個別のライセンスを適用する

リポジトリ内のすべてのプロジェクトに同じライセンスを適用する
-> Next.js と Nest とでライセンスが異なるので❌

リポジトリ内の各プロジェクトに個別のライセンスを適用する
-> ↑と同じ理由で⭕️

リポジトリ内の共通コンポーネントには共通のライセンスを、特定のディレクトリには個別のライセンスを適用する
-> これも使えそうなので⭕️

ということで

  • 共通部分と我々が作成した部分のライセンス
  • Frontend と Backend 配下でそれぞれのライセンス
    を適用することにしました。

複数のライセンスの混在をどう表現するのか

今回登場するライセンスはこうなりました。

  • Frontend (Next.js) -> Apache-2.0
  • Backend (Nest) -> MIT
  • それ以外の共通部分や作成したコード -> MIT

表現の方法については、README にライセンスの説明とその影響範囲を記載するのが良さそうでした。

できたものがこちらです。

ディレクトリ構造

├── backend
│ ├── LICENSE
│ └── README.md
├── frontend
│ ├── LICENSE
│ └── README.md
├── LICENSE
└── README.md

README.md

## Licenses

各ディレクトリは異なるライセンス下にあります。


### frontend

フロントエンドのコードは`frontend/`ディレクトリにあります。この部分はApache 2.0ライセンスの下で提供されています。詳細は[frontend/LICENSE](./frontend/LICENSE)を参照してください。

### backend

バックエンドのコードは`backend/`ディレクトリにあります。この部分はMITライセンスの下で提供されています。詳細は[backend/LICENSE](./backend/LICENSE)を参照してください。

### その他のコード

本ディレクトリ及びその他のディレクトリには、チームによって書かれたコードやファイルが含まれています。これらの部分については、このリポジトリのルートにある[LICENSE](./LICENSE)を参照してください。

LICENSE

MIT License

Copyright (c) 2023 mofmof inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

frontend/README.md

...

## License

Next.js is [Apache-2.0 licensed](https://github.com/mofmof/co-demon/blob/main/frontend/LICENSE).

frontend/LICENSE

Copyright 2023 Vercel, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

backend/README.md

...

## License

Nest is [MIT licensed](LICENSE).

backend/LICENSE

(The MIT License)

Copyright (c) 2017-2023 Kamil Mysliwiec <https://kamilmysliwiec.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

まとめ

それぞれのディレクトリに LICENSE ファイルを配置して README に丁寧な説明を書いておけば良さそう。

おまけ

今回の開発物は「GitHubのリポジトリのコードを食わせて質問できるボットを生成できるOSS」というテーマでの作成だったので、完成したボットにライセンスについて質問してみました。

$ npm run qa:repository ライセンス表示はどうなっていますか? co-demon

> co-demon@0.0.1 qa:repository
> ./node_modules/.bin/ts-node scripts/repository-qa.ts ライセンス表示はどうなっていますか? co-demon

質問: ライセンス表示はどうなっていますか?
リポジトリ名: co-demon
- バックエンドのコードは`backend/`ディレクトリに格納されており、MITライセンスで提供されています。
- フロントエンドのコードは`frontend/`ディレクトリにあり、Apache 2.0ライセンスで提供されています。
- その他のファイルやディレクトリに関連するライセンス情報は、リポジトリのルートにある`LICENSE`ファイルに記載されています。

いい感じに教えてもらえました。

Discussion