SPDX Tutorial

Software Package Data Exchange (SPDX) é um formato padrão para comunicar os componentes dos pacotes de software, incluindo informações sobre eles, incluindo licenças Direitos autorais. Inclui vários mecanismos que são especialmente úteis para software de código aberto. SPDX é uma norma internacional formalmente aprovada (como ISO/IEC 5962:2021), e sua especificação está disponível gratuitamente. Se você está desenvolvendo software de código aberto, um desenvolvedor que está considerando o uso de algum software de código aberto, ou alguém que tenha que investigar se software tem licenças aceitáveis, SPDX pode ajudar. SPDX é fácil de usar para casos comuns, e o SPDX torna mais fácil para todos os destinatários de software saber o que eles têm permissão para fazer (e não fazer). O SPDX foi criado e é mantido pela Linux Foundation. Eu recomendo pronunciar SPDX como “speed-X”; alguns de seus desenvolvedores pronuncie cada letra (“S-P-D-X”).

Este é um breve tutorial sobre o SPDX. Para usar o SPDX, você precisa entender três construções básicas: Identificadores de licença SPDX, Expressões de licença SPDX e Arquivos SPDX. Este tutorial também discutirá como usar Expressões de licença SPDX em arquivos de código-fonte, recomendações de licença e como obter mais informações.

Identificadores de licença SPDX

Os identificadores de licença SPDX são o coração do SPDX. Um identificador de licença é uma cadeia de caracteres de texto curta legível por humanos que identifica exclusivamente uma licença. Aqui estão alguns identificadores de licença SPDX (em ordem alfabética) para alguns amplamente utilizados livre/libre/software de código aberto licenças, seguidas pelo que os identificadores significam:

Observe que o ‘-somente’ sufixo é usado apenas no contexto da GPL. Em todas as outras licenças sem o sufixo, também significa “apenas esta versão”.

Da mesma forma, aqui estão alguns obras culturais gratuitasLicenças (normalmente usado para trabalhos que não sejam software):

Os identificadores de licença SPDX nunca contêm um espaço. As licenças SPDX usam correspondência sem distinção entre maiúsculas e minúsculas, no entanto, as pessoas são incentivadas a fornecer e exibir os formulários de caso misto quando for razoável. Em URLs, as pessoas são encorajadas a oferecer suporte a formulários de letras maiúsculas e minúsculas; se isso for impraticável, converta para minúsculas (para oferecer suporte à correspondência sem diferenciação de maiúsculas e minúsculas).

O Lista de licenças SPDX tem uma lista muito mais completa de identificadores de licença SPDX e é ocasionalmente atualizada com novos. Nem todas as licenças na lista são licenças de software de código aberto (OSS), mas a lista inclui as licenças OSS mais populares. A partir de setembro de 2015, a lista de licenças SPDX define identificadores de licença padrão para mais de 300 licenças.

Expressões de licença SPDX

Em algumas situações, não há apenas uma licença, por exemplo, o software pode ser oferecido com uma escolha entre duas ou mais licenças. SPDX versão 2.0, lançado em 2015, adicionou suporte para SPDX expressões de licença, que permitem que você expresse claramente as escolhas quando você precisa.

Uma expressão de licença SPDX pode ser um identificador de licença SPDX simples ou um SPDX “referência de licença definida pelo usuário” (também conhecida como LicenseRef). Um LicenseRef pode ser usado se uma licença ainda não estiver definida por um padrão Identificador de licença SPDX. Não entraremos em como você faz isso neste tutorial… mas é bom conheça você poder Faça isso.

As expressões de licença SPDX também oferecem suporte a um sufixo “+” após uma licença identificador; o “+” significa “esta licença ou qualquer versão posterior”. Por exemplo, você pode expressar “Apache License 2.0 ou posterior” usando a expressão de licença SPDX “Apache-2.0+”.

Há um caso especial envolvendo “+”: licenças GNU (como a GPL) são manuseados especialmente (desde SPDX License List 3.0) e não use mais o “+”. Por exemplo, GPL-2.0-ou-posterior significa “GNU General Public License (GPL) versão 2.0 ou posterior”, em vez de usar “+”. A razão para este caso especial é que a expressão mais antiga “GPL-2.0” nem sempre foi usada para significar “apenas a versão 2”, mesmo que devesse ter sido, de modo que essa expressão se tornou ambígua. Sugiro que se você sabe que o software usa a licença GPL-2.0, mas tem não determinado se “ou mais tarde” se aplica, você deve considere o uso da obsoleta marcação “GPL-2.0”. Por outro lado, se você está marcando o software, você mesmo libera, por favor, forneça uma expressão de licença mais precisa para que todos caso contrário, saberão exatamente o que eles estão autorizados a fazer.

Você também pode usar três operadores diferentes para combinar expressões de licença para criar outras expressões de licença:

  • “OU”: Os destinatários podem escolher entre duas ou mais licenças. Por exemplo, “(LGPL-2.1-only OR MIT OR BSD-3-Clause)” significa que os destinatários podem escolher entre qualquer uma dessas três licenças.
  • “E”: Os destinatários são obrigados a cumprir simultaneamente duas ou mais licenças. Por exemplo, “(LGPL-2.1-only AND MIT AND BSD-2-Clause)” significa que os destinatários devem cumprir todas as três licenças.
  • “WITH”: Adicione a seguinte exceção nomeada. Por exemplo, “(GPL-3.0-or-posterior WITH Classpath-exception-2.0)” significa que os destinatários devem estar em conformidade com a GPL versão 3.0 ou posterior com a exceção de licença do Classpath 2.0. Veja o Lista de exceções de licença SPDX para a lista de nomes padrão para exceções de licença.

Há uma ordem de operações: “+”, depois “COM”, depois “E”, depois “OU”. Essa ordem pode ser substituída por parênteses e, se for complexa. parênteses são bons para a clareza. Qualquer expressão de licença que consista em mais de um identificador de licença e/ou LicenseRef deve ser encapsulado por parênteses. As expressões SPDX não diferenciam maiúsculas de minúsculas, mas, por convenção, a operação os nomes devem estar em maiúsculas.

Para mim, identificadores de licença e expressões de licença são as verdadeiras razões para usar o SPDX. No entanto, ambos são menos úteis, a menos que você possa pôr suas informações em algum lugar.

A maioria das linguagens de programação tem um gerenciador de pacotes de biblioteca de idiomas, e a maioria dos sistemas tem um gerenciador de pacotes no nível do sistema; cada gerenciador de pacotes tem um formato de pacote. Em quase todos eles há um campo de “licença” e, na maioria dos casos, você pode simplesmente usar uma expressão de licença SPDX nesse campo.

Há também duas outras maneiras de capturar essas informações: SPDX e incorporação de informações de licença em arquivos de origem. Aqui vou me concentrar especialmente em como os desenvolvedores de software podem usá-los.

Arquivos SPDX

Se você quiser gerar um arquivo SPDX completo que identifica todos os componentes no sistema, também conhecido como sua “lista de materiais de software” (SBOM), provavelmente é melhor usar uma ferramenta para gerar arquivos SDPX. Um exemplo é spdx-sbom-gerador) Dito isto, é bom saber o que os arquivos SPDX contêm, especialmente se você quer fazer mais do que as ferramentas existentes fazem.

Arquivos SPDX são uma maneira de capturar e trocar informações sobre alguns softwares e suas dependências, como informações de licença, de uma forma que seja independente da(s) linguagem(s) de programação e do pacote gerente(s) usado(s). A especificação SPDX na verdade suporta dois formatos: tag:value e RDF/XML. Eles podem fazer a mesma coisa, mas tag:value é mais fácil de escrever, então isso é o que vamos usar aqui. Um arquivo tag:value é normalmente uma sequência de linhas, onde cada linha é uma nome da marca, dois pontos, um espaço e seu valor.

Há muitas tags definidas na especificação SPDX, mas muitas delas podem não se aplicar à sua situação específica. Observe que, ao contrário das expressões de licença, os nomes de marcas diferenciam maiúsculas de minúsculas. Algumas tags especialmente importantes ou úteis são:

  • SPDXVersion: A versão da especificação usada, normalmente “SPDX-2.1”.
  • DataLicense: A licença para os dados da licença em si (!); normalmente este é “CC0-1.0”. Observe que isso é não a licença para o software ou dados que estão sendo empacotados.
  • Criador: quem ou o que criou este arquivo SPDX (não o criador do pacote). Isso está em um dos 3 formatos:
    • Para uma pessoa: nome da pessoa, opcionalmente seguido de e-mail entre parênteses.
    • Para uma organização: nome da organização, opcionalmente seguido de email entre parênteses.
    • Para uma ferramenta: toolidentifier-version
  • PackageName: O nome completo do pacote fornecido pelo Package Originator.
  • PackageOriginator: A pessoa ou organização de quem o pacote veio originalmente.
  • PackageVersion: O número da versão desta versão específica do pacote (opcional).
  • PackageHomePage: URL da página inicial do pacote.
  • PackageLicenseDeclared: A licença identificada em texto em um ou mais arquivos (por exemplo, um arquivo COPYING ou LICENSE) no pacote de código-fonte. Este campo não se destina a capturar informações de licença obtido de uma fonte externa, como o site do pacote.

Por exemplo, um arquivo SPDX com as seguintes linhas indica o seguinte: este pacote usa a especificação SPDX versão 2.1 (a versão atual), as informações de licença podem ser compartilhadas com todos, ele descreve o pacote Foo criado por David A. Wheeler, ele tem a página inicial do projeto dado, e os mantenedores do pacote declaram que todo o software neste pacote é liberado usando a licença MIT:

SPDXVersion: SPDX-2.1  DataLicença: CC0-1.0  Nome do pacote: Foo
PackageOriginator: David A. Wheeler  PacoteHomePage: https://github.com/david-a-wheeler/spdx-tutorial/  PackageLicenseDeclarado: MIT

Há muito mais tags que você pode usar. Eles são explicados na íntegra Especificação SPDX.

Agora, uma nota pessoal. Muitas das marcas e recursos na especificação do arquivo SPDX são úteis somente ao trocar arquivos SPDX que estão isolados de seus pacotes para que você possa descrever grandes coleções de pacotes. Em particular, a especificação considera oficialmente muitas tags obrigatórias, mas eu, pessoalmente, as interpretaria apenas como “obrigatório” se você estiver tentando trocar arquivos SPDX que estão isolados de seus pacotes. Se você é um desenvolvedor de pacotes que lança software e deseja apenas incluir um arquivo curto que descreve a licença que você está usando apenas para o software que você está liberando, sugiro começar com as linhas listadas no exemplo acima (enfatizando PackageLicenseDeclared). Nesses casos, você realmente não precisa de tags como o carimbo de data/hora “Criado” (seu sistema de controle de versão faz isso), “DocumentName” (você pode ver o que é), “PackageDownloadLocation” (que muda o tempo todo) e assim por diante.

No entanto, se você estiver trocando arquivos maiores sobre muitos componentes de software, especialmente se você estiver trocando-os sem o próprio software, então absolutamente fazer incluir todas as tags obrigatórias. Organizações que precisam lidar com muitos componentes e licenças precisam dessas informações adicionais quando fazem a revisão legal, e é para isso que essas tags servem. If you are in that more complicated circumstance, see the SPDX site for information about tools that can help you.

The SPDX specification doesn’t specify a file extension or file naming convention. I personally recommend using “.spdx” for a SPDX file in tag:value format (as described here), and using “.rdf” for a SPDX file in RDF+XML format (this appears to be a best practice). When combining SPDX files together people often use the project name as the filename. Personally, I think having a file named “LICENSE.spdx” at the top level would be perfectly reasonable when including a SPDX file inside a single project. To my knowledge SPDX (in either format) has not yet been formally registered as a MIME type.

If you’re developing software or other copyrightable content, you still need to select a license and express it in a way humans can understand. For software, create a file named LICENSE or COPYING (possibly with a .md or .txt extension) to provide human-readable text of the license. Also create a SPDX file, as described above, so programs can automatically process exactly what the license is, and humans can have a short and precise way of representing the license of the software.

SPDX license expressions in source code files

You can also refer to SPDX license expressions from within source code. Embedding a copyright or license statement in every file isn’t required by copyright law, but there are advantages to including them. For example, they make it easier for people to determine what they’re allowed to do, and who to contact if they need more… even if the file was quietly copied untracked to a different project. The traditional way is annoying; it involves embedding large quantities of legalese in your source code headers.


Artigo Original

  • https://github.com/david-a-wheeler/spdx-tutorial