Что такое SPDX
SPDX (Software Package Data Exchange) — проект под эгидой Linux Foundation и стандарт машиночитаемого описания компонентов ПО и сведений о лицензиях. В 2021 году он стал международным стандартом ISO/IEC 5962:2021. Шире всего используются короткие идентификаторы из списка лицензий SPDX: договорённость писать просто MIT вместо разнобоя вроде «MIT License», «The MIT license», «лицензия MIT».
Две строки в заголовке файла
Если поместить в начало исходного файла следующие две строки в виде комментария, и люди, и инструменты сразу увидят правообладателя и лицензию файла.
// SPDX-FileCopyrightText: 2026 Jane Doe <jane@example.com>
// SPDX-License-Identifier: MIT
- В
SPDX-License-Identifierуказывается идентификатор лицензии или выражение (MIT OR Apache-2.0). SPDX-FileCopyrightText— уведомление об авторском праве. Если правообладателей несколько, пишут несколько строк.- Ядро Linux с 2017 года начало заменять длинные лицензионные уведомления этой одной строкой и избавилось от тысяч строк дублирующегося шаблонного текста.
Вкладка генератора «Заголовок файла» создаёт эти две строки в семи стилях комментариев.
Осторожно с устаревшими идентификаторами
Начиная с версии 3.0 списка лицензий SPDX (декабрь 2017 года) условие о версии лицензий GNU должно быть видно в идентификаторе.
| Устаревший идентификатор | Актуальный идентификатор |
|---|---|
GPL-2.0 | GPL-2.0-only |
GPL-2.0+ | GPL-2.0-or-later |
GPL-3.0 | GPL-3.0-only |
LGPL-2.1 | LGPL-2.1-only |
AGPL-3.0 | AGPL-3.0-only |
Если написать просто GPL-3.0, непонятно, имеется в виду «only» или «or later». Разница между ними объяснена в статье only и or-later.
Метаданные пакетов
Большинство менеджеров пакетов принимают идентификаторы или выражения SPDX.
| Экосистема | Файл | Пример |
|---|---|---|
| npm | package.json | "license": "MIT" · закрытый пакет: "UNLICENSED" |
| Rust | Cargo.toml | license = "MIT OR Apache-2.0" |
| Python | pyproject.toml | license = "Apache-2.0" (PEP 639) |
| Maven | pom.xml | Название и URL внутри <licenses> |
UNLICENSED в npm означает совсем не то, что «Unlicense»: это пометка закрытого пакета, использование которого не разрешено. Из-за похожего написания ошибки случаются часто.
REUSE: весь репозиторий — машиночитаемым
Спецификация REUSE от Европейского фонда свободного ПО (FSFE) определяет, как единообразно применять заголовки SPDX во всём репозитории.
- Все тексты лицензий кладут в папку
LICENSES/с именамиидентификатор_SPDX.txt(например,LICENSES/MIT.txt). - В каждый файл добавляют
SPDX-FileCopyrightTextиSPDX-License-Identifier. - Для файлов, куда нельзя вставить комментарий (изображения, JSON и т. п.), сведения указывают в соседнем файле
имя_файла.licenseили вREUSE.tomlв корне репозитория. - Инструментом
reuse lintпроверяют, не пропущены ли файлы.
Практические советы
- Пишите идентификаторы с учётом регистра точно так, как в списке (
Apache-2.0, а неapache2). - Собственные лицензии, которых нет в списке, записывают с префиксом
LicenseRef-(например,LicenseRef-Proprietary). - Одного идентификатора без текста лицензии вряд ли достаточно для выполнения обязанности уведомления. Тексты лицензий храните отдельными файлами.
Эта статья содержит общую информацию и не является юридической консультацией. Важные решения обсуждайте со специалистами.
Источники
- SPDX License List — https://spdx.org/licenses/
- SPDX Specification, Annex: Using SPDX short identifiers in source files — https://spdx.github.io/spdx-spec/v2.3/using-SPDX-short-identifiers-in-source-files/
- REUSE Specification — https://reuse.software/spec/
- npm Docs, package.json license — https://docs.npmjs.com/cli/configuring-npm/package-json#license
- PEP 639 — https://peps.python.org/pep-0639/