Блог CodeScoring

Что такое PURL?

Питонист работает с PyPi и легко ориентируется в названиях подключаемых пакетов. Фронтендер аналогично работает с NPM. Но что если вам надо в рамках одной системы хранить, использовать и различать пакеты из разных экосистем?

Эту задачу и призван решить PURL — package "mostly universal" URL, т.е. практически универсальный URL (идентификатор) пакета. Это далеко не единственная, но наш взгляд одна из самых удачных схем идентификации пакетов, применимая к любому пакетному менеджеру и технологии.

Идентификатор составляют семь компонентов, объединённых в строку: 
scheme:type/namespace/name@version?qualifiers#subpath

  • scheme — константа со значением pkg
  • type — обозначение пакетного менеджера (из словаря)
  • namespace — например, groupId в Maven
  • name и version говорят сами за себя
  • qualifiers — дополнительная опциональная информация, например указание на архитектуру или операционную систему
  • subpath — опциональный путь внутри пакета, относительно его корня

На примерах:

pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie
pkg:gem/ruby-advisory-db-check@0.12.4
pkg:github/package-url/purl-spec@244fd47e07d1004f0aed9c
pkg:golang/google.golang.org/genproto#googleapis/api/annotations
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?packaging=sources
pkg:npm/foobar@12.3.1
pkg:nuget/EnterpriseLibrary.Common@6.0.1304
pkg:pypi/django@1.11.1

URL в названии используется не случайно, это действительно валидный адрес, соответсвующий стандартам, который вполне могут научиться обрабатывать разные приложения.

Подробно изучить стандарт можно по ссылке: https://github.com/package-url/purl-spec.