Я работаю над программой обновления и хочу, чтобы программа обновления могла обновлять себя (удалить и скопировать новый файл, из которого запускается скрипт).
Самообновляющиеся модули, особенно в контексте менеджера пакетов, такого как npm, раздражают меня неправильно, потому что они нарушают предсказуемое состояние. Если я устанавливаю [email protected]
, я хочу, чтобы это было так, и всегда будет таким, пока я целенаправленно не установлю следующую версию.
@zero298 это не самообновляющийся модуль, а просто команда для обновления основного приложения. Однако спасибо, что указали на это :)
Не очень хорошая практика.
И вы не можете обновлять во время работы. Что я могу предложить, так это то, что вы можете создать новый файл где-нибудь с обновлениями, а затем заменить текущий файл новым файлом из запланированного задания, которое запускается через некоторое время. Не уверен, что ответил на ваш вопрос, но это то, о чем я могу думать.
Спасибо за усилия, но не могли бы вы дать больше объяснений, почему это плохая практика? У меня нет доступа к системным файлам или я не могу использовать sudo, поэтому создание запланированной задачи для меня на самом деле невозможно. Спасибо :)
Если вы работаете над приложением, которое позволяет пользователю создавать свои собственные js-файлы в некоторой среде и запускать их мгновенно, то у вас может не быть большого выбора. В противном случае я бы предложил использовать БД для управления настройками приложения, иначе изменения могут привести к сбою вашего приложения. Кстати, я могу ошибаться :)
Пример:
var fs = require('fs');
console.info("I'm about to delete myself...");
console.info('clonning myself...');
fs.copyFileSync('./selfDelete.js', './selfDelete_bkp.js');
console.info('removing myself...');
fs.unlinkSync('./selfDelete.js');
console.info('new version of me...');
fs.renameSync('./selfDelete_bkp.js', './selfDelete.js');
Конечно, ничто не мешает вам удалить исходный файл, поскольку после того, как он потребуется в модуле, он не будет снова прочитан с диска (если только вы не сделаете недействительным кеш, но это хак). Это плохая практика? В общем, возможно, но звучит разумно для вашего варианта использования.