Comments 38
А вы не сильно верьте в то, что написала корпорация Микрософт внизу функций.
Например, берём такую функцию как CreateWindowExA
— там нет упоминания Win95, хотя всем очевидно что в Win95 такая функция есть. Похоже, что могущественная корпорация вычищает упоминание о старых системах.
Не стоит доверять словам «Minimum supported client» на современном сайте, нужно или самостоятельно проверять наличие функции в библиотеке, или достать старые SDK.
Поставить в Windows 7 Virtual Box, создать в нем виртуальную машину Debian 12 и поставить туда Node.js нужной версии (и даже несколько версий) с помощью современных пакетных менеджеров, а также Visual Studio Code последней версии (а не как в Windows 7, где крайняя версия 1.78.2) для разработки на JavaScript и Python заняло бы куда меньше времени. 2 Гб ОЗУ для виртуалки вполне хватает для простой разработки. На диске такая виртуалка занимает место меньше 10 Гб . Отклик от GUI виртуалки комфортен - старый i3 с 2-мя ядрами для виртуалки справляется нормально для комфортной работой. И нет проблем с надежностью собранного "поделия". А так, конечно можно и на Windows XP что-нить из современного пересобрать. Но "стоит ли овчинка выделки?" - вот в чем вопрос.
1.Чтобы заработала аппаратная виртуализация, нужна поддержка специальных регистров в процессоре, без которых все будет совсем уж медленно и печально.
Поскольку речь идет не о обычном домашнем PC а о программно‑аппаратном комплексе, то там помимо устаревшей ОС еще и устаревшее железо, например CPU из 2007го года, где либо нет поддержки аппаратной виртуализации либо она еще недоработанная — с багами.
Сама ОС в таком комплексе может быть без обновлений, например Windows7 и Windows7 SP1 — это очень сильно разные системы, хотя и называются одинаково. Современный VirtualBox да и просто любой свежий софт легко может запросить именно SP1 и не заработать вообще на старой версии.
Так что увы но нет, если речь заходит об устаревшем окружении — это всегда «цемент», который нельзя ни двигать ни править, но с которым надо как‑то жить.
Шуткой скажу, но просто подключить к аппаратно-программному комплексу raspberry pi и на нем уже запускать веб-сервис, а на windows 7 только проксировать - это как по мне более безопасный и легкий способ при неработающей виртуализации.
Допускаю что могу ошибаться, но со стороны бэкпортирование кажется излишне бесполезным занятием. Да и к тому же раз уж не обновляется аппаратно-программный комплекс и он находится в строго изолированной среде, то и смысл обновлять средства разработки нет. Да, может babel будет не новым или angular. Но ведь разрабатывать можно
подключить к аппаратно-программному комплексу raspberry pi
Есть очень большая разница между бытовой электроникой и промышленной. Проще говоря ваш raspberry pi в цеху при серьезной и постоянной нагрузке просто сгорит.
Как и большинство бытовых компьютеров — попробуйте например соорудить домашний сервер из ноутбука и воочию увидите как он выходит из строя в страшных муках. Не надо так делать в общем.
но со стороны бэкпортирование кажется излишне бесполезным занятием
А если скажу, что до сих пор выпускаются 3.5 дискеты (см. дату выпуска партии) — сильно удивитесь?
Недавняя история с поиском сисадмина для сети на базе Windows 3.1 в немецкую железнодорожную компанию на самом деле не является уникальной, очень много где используются еще более древние системы.
И под них до сих пор пишут и поддерживают софт.
И делают бекпорты, хотя разумеется речь не про портирование чего-то вроде Node.js на Windows 3.1.
Но ведь разрабатывать можно
С заметно большим трудом. И чем более устаревшее окружение — тем сложнее и дороже.
Таким вот бекпортом мы cильно удешевили и ускорили разработку, позволив обычным современным Node.js разработчикам с 3–5 лет опыта разрабатывать без оглядки на реалии системы которой на минуточку уже 15 лет.
попробуйте например соорудить домашний сервер из ноутбука
Я пробовал. Ноутбук больше пяти лет проработал особо не выключаясь, с достаточно заметной нагрузкой на диск и процессор, сначала параллельно с нормальным использованием, потом исключительно как сервер. До сих пор периодически включаю, работает, чувствует себя неплохо.
Хорошо бы ссылку на бинарник и патч
Выложил вот тут: https://filetransfer.io/data-package/zOkMP8uP#link обе сборки.
Непонятно вот что. Если вам норм средневековая версия винды, почему вас не устраивает питон с нодой из той же эпохи?
Потому что устаревший рантайм потянет за собой необходимость сборки с помощью устаревших инструментов, т.е. в данном случае пришлось бы всю разработку целиком проводить на старой версии Node.js.
Также не стоит забывать что речь идет о Node.js, для которой фразы «пожалуйста обновитесь» и «используйте последнюю версию» являются официальным руководством к действию от ее разработчиков, а «обратная совместимость» — грубым ругательством.
Но концептуально вы правы — в большинстве случаев при работе со «средневековыми» версиями действительно приходится разворачивать еще и «средневековую» разработку.
Потому что устаревший рантайм потянет за собой необходимость сборки с помощью устаревших инструментов, т.е. в данном случае пришлось бы всю разработку целиком проводить на старой версии Node.js.
Ну и... Ок?
Если же вы попробуете скачать и запустить более свежую версию — увидите вот такое сообщение:
Кабудта бы эту проверку до какой-то версии можно обойти добавлением переменной среды NODE_SKIP_PLATFORM_CHECK равной 1. Если точнее, нужно скачать последнюю поддерживаемую в Windows 7 версию v.13.14.0, установить её в нужную категорию стандартным инсталятором, а затем просто заменить все файлы в установленной директории из архива с бинарниками более новой версии.
Этого с горем пополам хватает для работы вплоть до 18-й версии. В гитхабе говорят, что якобы можно таким образом запустить и 20-ю, но у меня встречались некоторые глюки уже на 16-й: при попытках использовать node-gyp, он просто не работает, так что я в итоге так и остановился на 16-й, без всех этих танцев с бубном, так как остальные проекты работают.
Основная боль, конечно, это ублюдское отношение MS к старым VS и системам сборки, а также то что многие разрабы перелезают на новый питон. Из-за этого пришлось отказаться уже от нескольких приложений.
нашлись патчи из других открытых проектов, ...
посмотреть кто еще из открытых проектов использует этот Maglev. ...
А почему просто не посмотреть реализацию этих функций из прошлых же версий ноды?
Дело в том что этот проект maglev берется из chromium, из движка v8 и копируется в Node.js как зависимость.
Насколько я понял, сама разработка maglev на стороне Node.js не ведется вообще, его просто копируют из апстрима, поэтому например разница в этом месте между 20й и 22й Node.js очень большая — концов не найти.
Так, а где в итоге линк на сборку, которая у вас получилась? Вообще-то 20-я версия бы не помешала.
Не собирать же самому по этим гайдам...
Выложил вот тут: https://filetransfer.io/data-package/zOkMP8uP#link обе сборки.
>Не собирать же самому по этим гайдам...
Это не настолько сложно как кажется.
А какие-то автоматизированные тесты вы не запускали? Наверняка же они есть в node.js
Народ, ну зачем там мучаться с непосредственной установкой старой версии VS на старую же версию винды? Всё же можно сделать гораздо проще:
Скачиваем исходники на машину, где уже стоит Visual Studio 2022;
Меняем там необходимый код;
Билдим прямо на этой же машине (она может быть хоть на Windows Server 2025 - ОС здесь маловажна);
На целевой Windows 7 ставим Microsoft Visual C++ Redistributable (https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170);
Копируем на целевую Windows 7 полученный файлы;
Используем последний Node.js и радуемся;
Все эти пункты я проверил сейчас сам: всё работает. Единственное что при запуске полученного файла на "голой" Windows 7 SP1 возникла ошибка об отсутствии функции EventSetInformation в ADVAPI32, но всё решилось патчем от Microsoft (https://download.microsoft.com/download/4/E/8/4E864B31-7756-4639-8716-0379F6435016/Windows6.1-KB3080149-x64.msu). На моей машине весь билд занял порядка 10-ти минут. Полностью весь процесс от начала скачивания исходников до залития на Windows 7 занял порядка получаса.
Добрый день, так тоже можно, но могут возникать непредсказуемые ошибки, одну из которых (ошибка об отсутствии функции EventSetInformation в ADVAPI32) вы успели словить.
Node.js большая и сложная и слой совместимости не заканчивается на C++ Redist.
Дело не в конкретной программе (Node.js). Дело в том, что для того, чтобы запускать где-то скомпилированную программу нет необходимости ставить туда и сам компилятор.
нет необходимости ставить туда и сам компилятор.
Зато есть необходимость быть максимально близко к пользовательскому окружению, поэтому сборка для Windows 7 и делается на Windows 7.
В случае с Linux это ещё можно учитывать (очень большой разброс в реализации используемых библиотек). В случае с Windows всё решается Microsoft Visual C++ Redistributable.
Если вам интересна тема портирования на Windows 7 - посмотрите вторую статью, про Golang.
Там например мы попали на такое:
RtlGenRandom is a semi-undocumented API, also known as SystemFunction036, which we use to generate random data on Windows. It's definition, in cryptbase.dll, is an opaque wrapper for the documented API ProcessPrng. Instead of using RtlGenRandom, switch to using ProcessPrng, since the former is simply a wrapper for the latter, there should be no practical change on the user side, other than a minor change in the DLLs we load.
Все красиво, логично и замечательно, кроме того что в Windows 7 нет поддержки функции ProcessPrng. А упомянутая SystemFunction036 внезапно есть.
Так что увы но нет, одной библиотекой рантайма вопрос не решается.
Я вам про Фому, а вы мне про Ерёму. Я говорю про компилирование C++ программ. А с Go совсем другие танцы.
Все тоже самое - вызываются функции ОС, разные в разных версиях. Пример такой функции в цитате выше.
В статье про бекпортирование компилятора Golang на Windows 7, не про разработку на самом Golang.
Удивительно, но сборка Golang с помощью стандартного компилятора Microsoft не поддерживается и требует MinGW
Конечно MinGW плевать хотел на Microsoft Visual C++ Redistributable
Вы точно понимаете как работает MSVCR? Какое отношение это имеет к RtlGenRandom которая находится в отдельной .dll которой в Windows 7 просто нет?
Вы написали статью, в которой говорите, что "команда опытных разработчиков" для компиляции одной программы установила целиком компилятор на целевую систему вместо того, чтобы установить маленький redistributable package. Я вам указал на вашу ошибку. И вместо того, чтобы сказать "да, мы налажали, спасибо за науку" вы пытаетесь как-то оправдываться. Должен сказать, что таким поведением вы ещё сильнее ухудшаете своё положение. Ошибка у вас была очень тривиальной, никакие оправдания тут не помогут. Пытаться как-то указать, что вы якобы больше знаете чем я - ну попытайтесь. Только вот все эти "бодания" бессмысленны - ошибку вы всё-равно уже совершили.
Не очень понял о чем вы, если честно. Компилятор C++ — часть среды Visual Studio и разумеется он не устанавливался на конечную систему, где происходила эксплуатация.
С чего вы это выдумали мне неведомо.
Про возможные проблемы с кросскомпиляцией и MSVCR я вроде уже объяснил, если вы не понимаете как это работает — не моя проблема. Это сложная тема, не для всех.
А ошибки рекомендую искать в собственном коде, это более осмысленно, за это хотя-бы платят.
Бекпорт на примере Node.js v22 и Windows 7