Запускаем MarkText на FreeBSD
Очередные ужасы из тяжкой жизни пользователей BSD или что делать, когда нужная программа ненавидит вашу операционную систему.
В помощь начинающему, продолжающему и заканчивающему автору.
Очко электрона
Следующим по уровню безнадежности занятием на FreeBSD, после нейросетей и разработки на .NET является работа с приложениями на Electron.
Широкие народные массы требуют это и уже очень давно:
Но ввиду разных причин (в первую очередь идеологических), официальной поддержки все также нет.
И скорее всего не будет никогда.
Зато есть неофициальный форк, который успешно заехал в пакетную базу и довольно давно там живет.
Как можно заметить из истории коммитов выше — идет активная разработка и прием пул-реквестов.
Electron это фреймворк для построения десктоп-приложений с помощью одноименного движка.
Но портировали на FreeBSD только движок Electron, без средств сборки конечных приложений на нем.
Речь в первую очередь про electron-builder:
A complete solution to package and build a ready for distribution Electron, Proton Native app for macOS, Windows and Linux with “auto update” support out of the box.
Это не означает, что приложение на Electron не будет работать на FreeBSD совсем, но и не значит, что полноценная разработка таких приложений там возможна.
Немного работает — так это обычно описывают.
MarkText
MarkText это такой редактор для Markdown-разметки, один из самых лучших, известных и популярных:
A simple and elegant open-source markdown editor that focused on speed and usability.
Именно его я использую для верстки своих статей и документации.
К сожалению редактор построен на том самом Electron, поэтому для нормальных людей, не отягощенных двумя десятилетиями разработки нет вариантов его использования на FreeBSD — ни в Wine, ни с помощью слоя совместимости с Linux эта штука не работает.
Хотя пожелания есть:
Скотская сборка
Как бы это ни было удивительно, но Node.js и npm давно и успешно работают во FreeBSD, поэтому все спокойно устанавливается из пакетов:
pkg install node25 electron37 npm-node25
git clone --depth 1 https://github.com/marktext/marktext.git
Активная разработка по какой-то причине остановлена, народ начинает беспокоиться, поэтому я не стал заморачиваться релизными версиями и собирал из текущей ветки.
Сборка использует еще один пакетный менеджер — yarn, который необходимо установить с помощью npm:
npm -g i yarn
Дальше начинается первый нюанс:
необходимо отключить скачивание бинарной сборки Electron, поскольку ее не существует для FreeBSD.
Перед запуском скачивания зависимостей, необходимо выставить специальную переменную:
export ELECTRON_SKIP_BINARY_DOWNLOAD=1 yarn install
Через какое-то время (скачивание зависимостей в проекте на Node.js — очень долгий и болезненный процесс) в корневом каталоге должна появиться папка node_modules откровенно скотских размеров:
Следующим шагом необходимо убрать искусственную заглушку, вставленную автором MarkText для того чтобы редактор не пытались запускать там где не надо — частая практика для проектов на Electron.
В файле src/main/index.jsесть вот такой замечательный код:
// NOTE: We only support Linux, macOS and Windows but not BSD nor SunOS.
if (!/^(darwin|win32|linux)$/i.test(process.platform)) {
process.stdout.write(`Operating system "${process.platform}" is not supported! Please open an issue at "https://github.com/marktext/marktext".\n`)
process.exit(1)
}Не представляю кто смог упороться до такой степени, чтобы гонять десктоп-приложение на Electron на Солярисе, но думаю не будет откровением, что вызов process.exit(1) необходимо закомментировать для продолжения банкета.
Теперь переходим к собственно сборке.
Штатно сборка MarkText происходит вызовом команды yarn build, но если посмотреть внутрь файла package.json, в котором находятся все команды сборки, увидим:
.. "build": "node .electron-vue/build.js && electron-builder", ..
Вызов electron-builder очевидно упадет, поскольку он не был портирован на FreeBSD и плотно завязан на готовые бинарные части и ветвления логики под конкретную поддерживаемую ОС.
Так что вызываем лишь первую часть, причем вручную (без всяких yarn):
node .electron-vue/build.js
Должен отработать webpack, sass и в каталоге dist будет находиться готовое к запуску приложение на Electron.
К сожалению в «обнаженном» виде, без прилепленного рантайма, что однако никак не мешает его запустить:
electron37 dist/electron/main.js
Так выглядит запущенный MarkText на FreeBSD, в работе над английскими версиями статей:
Для удобства использования можно перенести каталоги dist и node_modules в отдельное место:
И запускать вот таким скриптом:
#!/bin/sh /usr/local/bin/electron37 dist/electron/main.js
Готовый архив со сборкой можно скачать в нашем Телеграм-канале.
Update 02.05.2026
С момента написания статьи в FreeBSD появилась обновленная версия Electron 3.9, несовместимая с 3.7, пакет с которой еще и удалили.
Что еще печальней, сам Marktext работает с еще более старой версией, зависящей от устаревшей Node.js 18, биндинги к которой более не совместимы с 25 и выше в новом Electron.
Поэтому собирать придется с помощью Node 22:
pkg install node22 electron39 npm-node22
Второй печальный нюанс — блокировка ресурсов ElectronJS для доступа из РФ, поэтому для сборки, во время которой присходит скачивание заголовков Node.js необходимо выставить прокси:
yarn config set httpsProxy 103.131.232.9:8080
export DEBUG=electron-rebuild
Для проверки скачивания архива с заголовками:
wget -e use_proxy=yes -e https_proxy=103.131.232.9:8080 https://artifacts.electronjs.org/headers/dist/v18.0.4/node-v18.0.4-headers.tar.gz
Собранная с таким трудом сборка упадет при запуске с вот такой ошибкой:
TypeError: features.isDesktopCapturerEnabled is not a function
Чтобы ее увидеть надо задать две переменные окружения:
export ELECTRON_ENABLE_LOGGING=1 export ELECTRON_ENABLE_STACK_DUMPING=1
Для исправления необходимо закомментировать два блока в конце файла @electron/remote/dist/src/common/module-names.js:
const features = get_electron_binding_1.getElectronBinding('features');
/*if (!features || features.isDesktopCapturerEnabled()) {
exports.browserModuleNames.push('desktopCapturer');
}*/
/*if (!features || features.isViewApiEnabled()) {
exports.browserModuleNames.push('ImageView');
}*/Конечно это адский костыль и времененное решение, но обновлять Marktext целиком на новую версию Electron — сил не хватит.