Некоторое время назад я создал гибридное приложение — web/android/ios, которое помогает подготовиться к тайскому экзамену по вождению — https://www.driving-exam-thailand.com. Приложение стало популярным, и я подумал о создании подобных приложений для других стран. Разница между другими приложениями в основном заключается в вопросах, поэтому я подумал, что было бы здорово иметь возможность создавать множество мобильных приложений из одного репозитория. Я проверил в Интернете, но не мог найти готового решения. После небольшой работы мне удалось создать хорошее рабочее решение, которое я представлю ниже.

/
├── android/
├── ios/
└── capacitor.config.ts

После добавления Capacitor в ваш проект (и android, и ios) вы можете видеть, что на самом деле Capacitor добавляет только 1 файл (capacitor.config.ts) и 2 папки (android/ и ios/). Поэтому я подумал, что на самом деле я могу просто переместить эти файлы в другое место, а затем собрать проект. К сожалению, я обнаружил, что для работы конденсатора нужны эти файлы в основной папке. На самом деле это не проблема, это означает, что мне просто нужно переместить эти файлы в основную папку, и после создания приложения я могу переместить их обратно туда, куда захочу.

/
├── capacitor/
    ├── th/
        ├── android/
        ├── ios/
        └── capacitor.config.ts

Вы можете видеть выше новую структуру папок. Итак, теперь мне нужно автоматизировать перемещение файлов. Я нашел библиотеку npm — shelljs, которая позволяет запускать сценарии оболочки. Немного поиграв, я создал 2 скрипта и добавил ссылку на package.json.

// build-mobile.js
const shell = require('shelljs');

const [country] = process.argv.slice(2);

if (country) {
  // Move from localized folder to main folder
  shell.mv(`./capacitor/${country}/capacitor.config.ts`, `./capacitor.config.ts`);
  shell.mv(`./capacitor/${country}/android/`, `./android/`);
  shell.mv(`./capacitor/${country}/ios/`, `./ios/`);

  shell.rm(`-R`, `./capacitor/${country}/`);

  // You can add comands here for building your project
}
// clean-mobile.js
const shell = require('shelljs');

const [country] = process.argv.slice(2);

if (country) {
  // Move back from main folder to localized folder
  shell.mkdir(`./capacitor/${country}/`);

  shell.mv(`./capacitor.config.ts`, `./capacitor/${country}/capacitor.config.ts`);
  shell.mv(`./android/`, `./capacitor/${country}/android/`);
  shell.mv(`./ios/`, `./capacitor/${country}/ios/`);
}
// package.json
{
  ...
  "scripts": {
    ...
    "build-mobile:th": "node ./build-mobile th",
    "clean-mobile:th": "node ./clean-mobile th",
...

Вы можете видеть, что скрипты действительно просты, они просто перемещают файлы между определенной папкой и основной. Теперь, если я хочу создать мобильное приложение для определенного региона, мне просто нужно запустить npm run build-mobile:[country] и после сборки очистить его с помощью npm run clean-mobile:[ страна]. Я думаю, что это чистое и красивое решение.