пакет управления lerna

NPM

Недавно я обнаружил, что организация каталога проекта в компании очень странная, и все подпроекты размещены вpackagesВ каталоге есть такая буффонада? Я проверил информацию и обнаружил, что это относительно популярныйmonorepoМодель управления проектами. React, Vue и Babel, популярные в последние годы, используют этот режим:

Мы обычно используемmultiple repositoriesРежим управления проектами: разбить большой проект на несколько небольших проектов, каждый из которых самостоятельно размещается на gitlab. Этот режим на самом деле неплох, но в некоторых случаях подпроект А зависит от подпроекта Б. Если подпроект Б часто меняется, то каждый раз при изменении В приходится модифицировать А, что очень хлопотно. При разработке front-end фреймворка или UI-библиотеки мы часто сталкиваемся с вышеописанной ситуацией, тогда можно рассмотреть следующееmonorepo.

monorepoВ конце концов, это всего лишь идея, так как же нам добиться такой организации кода?

Эта статья в основном знакомит с использованием lerna

Ссылка на исходный код

lerna

Установить глобальноlerna

npm i lerna -g

Lerna основана на git, создайте новый проект на githublearn-lerna

git clone git@github.com:deepred5/learn-lerna.git
cd learn-lerna

Инициализируйте проект:

lerna init

lerna автоматически создастpackagesПапка, в ней будут создаваться наши будущие проекты. Он также создаст новый в корневом каталоге.lerna.jsonконфигурационный файл

{
  "packages": [
    "packages/*"
  ],
  "version": "0.0.0" // 共用的版本,由lerna管理
}

создать пакет

Создаем два пакета:

cd packages
mkdir prpr-lerna-core
cd prpr-lerna-core
npm init -y
cd packages
mkdir prpr-lerna-popular
cd prpr-lerna-popular
npm init -y

Примечание. Мы опубликуем эти два пакета в npm в конце, поэтому, пожалуйста, сделайте имена особенными и не используйте их другими.

добавить зависимости

prpr-lerna-popularполагатьсяprpr-lerna-core, то есть два способа добавить зависимости:

Первый способ заключается в измененииprpr-lerna-popular/package.json,Добавить к

{
  "dependencies": {
    "prpr-lerna-core": "^1.0.0"
  }
}

затем бегиlerna bootstrap

Второй способ - использовать команду напрямуюadd

lerna add prpr-lerna-core --scope=prpr-lerna-popular

Пробежавшись, мы нашлиprpr-lerna-popularгенерируетсяnode_modules,а такжеnode_modulesсгенерированные указателиprpr-lerna-coreизмягкая цепь,аналогичныйnpm linkЭффект:

новыйprpr-lerna-core/index.js

const API = 'https://yande.re/post/popular_recent.json';

module.exports = {
  API
}

prpr-lerna-popularпомимо зависимостейprpr-lerna-core, вы также можете положиться на другие библиотеки с открытым исходным кодом, такие как мы используемaxios

lerna add axios --scope=prpr-lerna-popular

новыйprpr-lerna-popular/index.js

const { API } = require('prpr-lerna-core');
const axios = require('axios');

const getPopularImg = () => axios.get(API)

module.exports = getPopularImg;

// 测试代码,发布时删除
getPopularImg().then((res) => console.log(res.data.length));

есть тест:node packages/prpr-lerna-popular/index.jsПри нормальных обстоятельствах результаты могут быть выведены

Опубликовать в нпм

Сначала отправьте весь код

cd learn-lerna
git add .
git commit -m "test publish"

Зарегистрироватьnpmjsучетная запись

npm login

Войдите в свою учетную запись, если локальный npm является зеркалом Taobao, обязательно измените его обратноhttps://registry.npmjs.org/адрес! ! !

lerna publish

бегатьpublish, выберите номер версии выпуска

Lerna может помочь нам управлять номерами версий, что очень удобно!

Общие команды

lerna init #初始化
lerna bootstrap #下载依赖包或者生成本地软连接
lerna add axios #所有包都添加axios
lerna add prpr-lerna-core --scope=prpr-lerna-popular #给包prpr-lerna-popularx添加prpr-lerna-core依赖
lerna list
lerna clean

что-то другое

  • Lerna по умолчанию использует централизованную версию, и все пакеты имеют общую версию. Если вы хотите, чтобы разные пакеты имели свои версии, вы можете использоватьIndependentмодель

  • Имя пакета выпуска, если он@начало, напр.@deepred/core, npm считает, что это частный выпуск по умолчанию, вам нужно использоватьnpm publish --access publicвыпускать. ноlerna publishЭтот параметр не поддерживается, обратитесь к решению:issues

Ссылаться на

Говоря о монорепозитории