Вы застряли на конфигурации .npmrc, потому что проекту вашей компании необходимо использовать Private Packages?
Почему все еще отображается 404 Not Found , даже если токен настроен?
Когда в компании есть несколько команд и несколько пакетов (например, @frontend, @backend), как вы можете элегантно управлять .npmrc?
Разоблачение двух мифов о .npmrc
Чтобы понять .npmrc, вам сначала нужно понять, как он работает.
Проще говоря, его основная логика сводится к двум вещам: Сопоставление области видимости (Scope Mapping) и Аутентификация (Authentication).
1. Сопоставление области видимости (Scope Mapping)
Это говорит npm: когда вы видите пакет, начинающийся с @company, не ищите его на официальном npmjs.org, а перейдите в наш указанный GitLab Registry.
@company:registry=https://gitlab.com/api/v4/groups/100/-/packages/npm/
2. Аутентификация (Authentication)
С адресом вам также нужен ключ. Ключ — это ваш AuthToken.
Вот очень важное правило: URL-адрес реестра и путь AuthToken должны «точно совпадать».
# ✅ Верно: путь точно такой же, как у реестра, определенного выше
//gitlab.com/api/v4/groups/100/-/packages/npm/:_authToken=${GITLAB_TOKEN}
# ❌ Неверно: путь не совпадает, что приведет к ошибке прав доступа
//gitlab.com/api/v4/:_authToken=${GITLAB_TOKEN}
Многие люди часто терпят неудачу при настройке из-за лишней косой черты или отсутствия уровня в пути.
Ад зависимостей и ошибки 404
Самая головная боль — это когда вы устанавливаете пакет A, который зависит от пакета B (тоже приватного), а затем npm выдает ошибку 404 Not Found.
Почему так происходит? Это происходит потому, что npm теряется при разрешении зависимостей, если нет правильного соответствия.
Особенно, когда у вас есть две разные области видимости (например, @team-a и @team-b) в разных группах GitLab, .npmrc может стать чрезвычайно сложным и трудным в поддержке. Вкупе с тем фактом, что разные реестры могут требовать разные токены, одного управления этими переменными окружения достаточно, чтобы вас насытить.
Есть ли более разумный способ?
Рекомендуемое решение: Единый реестр группы загрузки и Независимый реестр проекта публикации
| Реестр | Описание |
|---|---|
| Group Registry | Чтобы иметь возможность унифицировать загрузку всех пакетов, унифицируйте настройку Group Registry для загрузки всех пакетов в этой группе GitLab. |
| Project Registry | Чтобы иметь права доступа при публикации, каждый проект может настроить свой собственный Project Registry для публикации. |
Зачем это делать?
| Причина | Описание |
|---|---|
| Простая установка | Можно легко устанавливать и загружать все пакеты в одной группе. |
| Простая публикация | Можно легко публиковать пакеты в их соответствующих проектах, избегая публикации разных пакетов в одном реестре, у каждого проекта есть свой реестр. |
| Простое управление токенами | Будь то компьютер разработчика или среда CI/CD, необходимо поддерживать только один набор GITLAB_NPM_TOKEN. |
| Избегайте ошибок зависимостей | Все приватные пакеты находятся в одном месте, npm совершенно точно не пропустит их. |
Конфигурация в действии
Вы можете скопировать этот шаблон напрямую:
Не забудьте переложить работу по защите токенов на переменные окружения, никогда не прописывайте токены прямо в коде!
# .npmrc
# Токен аутентификации уровня домена (охватывает все запросы на установку уровня группы и проекта)
//gitlab.com/:_authToken=${GITLAB_NPM_TOKEN}
# Для публикации: токен аутентификации уровня проекта (npm publish требует точного совпадения пути)
//gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}
# область действия @company использует реестр уровня группы
# Все пакеты @company/* будут установлены из этого реестра
@company:registry=https://gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/
# Другие публичные пакеты по-прежнему идут в официальную библиотеку
registry=https://registry.npmjs.org/
Настройте publishConfig в package.json для публикации пакета в соответствующем GitLab Project Registry.
{
"name": "@company/my-package",
"publishConfig": {
"@company:registry": "https://gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/"
}
}
Заключение
Благодаря стратегии “Единого реестра группы загрузки” и “Независимого реестра проекта публикации” мы можем значительно снизить затраты на обслуживание и сделать процесс разработки более плавным.
| Цель | Описание |
|---|---|
| Точное соответствие | Сопоставление области видимости и путь токена должны быть полностью согласованы |
| Безопасность превыше всего | Эффективно используйте переменную окружения ${GITLAB_NPM_TOKEN} для управления личной информацией |
| Централизованное управление | Приоритетное использование единой группы GitLab для загрузки всех приватных пакетов компании |
| Независимая публикация | Приоритетное использование независимых проектов GitLab для публикации соответствующих приватных пакетов, управляя соответствующими пакетами независимо, чтобы избежать путаницы |
Освоив эту логику, GitLab NPM Registry станет мощным помощником в процессе разработки вашей компании!