Open Source
Публикация npm-пакета
lodash скачивают 50 миллионов раз в неделю. is-odd - 500 тысяч. Даже маленький пакет с одной функцией может стать частью глобальной инфраструктуры. Опубликовать пакет - это взять на себя ответственность за тех кто на него полагается.
- left-pad инцидент 2016: 11-строчный пакет, удалённый одним человеком, сломал весь npm экосистему
- colors.js и faker.js: maintainer намеренно сломал свои пакеты в 2022 году
- event-stream 2018: compromised maintainer внедрил malware в популярный пакет
- npm provenance появился как ответ на supply chain атаки - теперь это стандарт
Настройка package.json для публикации
package.json - манифест вашего пакета. Для публичного npm-пакета он должен содержать больше чем для приватного проекта. Неправильный package.json - и пользователи получают сломанные типы, лишние файлы или неправильные entry points.
Вы создаёте npm-пакет React-компонентов. Куда поместить зависимость от React?
Публикация и автоматизация через GitHub Actions
Ручная публикация через `npm publish` работает, но только для маленьких проектов. Автоматизация через GitHub Actions - стандарт для серьёзных пакетов: каждый tag автоматически публикует версию, без человеческих ошибок.
**npm provenance** (--provenance флаг) - новая фича npm которая криптографически связывает опубликованный пакет с конкретным GitHub Actions run. Пользователи могут верифицировать что пакет собран именно из вашего репозитория. Это защита от supply chain атак.
Вы случайно опубликовали версию 1.2.0 с багом. Можно ли unpublish и опубликовать правильный 1.2.0?
Ключевые идеи
- peerDependencies для React, Vue и других фреймворков - избегает дублирования
- "files" в package.json - whitelist что публиковать: только dist, README, LICENSE
- exports поле - современный способ определить entry points для ESM и CJS
- GitHub Actions + NPM_TOKEN = автопубликация по git tag
- npm provenance - криптографическая верификация источника пакета
Связанные темы
Пакет опубликован. Следующий шаг - документация которая помогает людям его использовать.
- Следующий урок курса — Логическое продолжение
Вопросы для размышления
- Почему left-pad инцидент стал возможен? Какие изменения npm внёс после него?
- Запустите `npx publint` на любом вашем пакете. Что он нашёл?