Как мне автоматически перезагрузить расширение Chrome, которое я разрабатываю?


Я хотел бы, чтобы мое расширение chrome перезагружалось каждый раз, когда я сохраняю файл в папке расширения, без необходимости явно нажимать "перезагрузить" в chrome://extensions/. Это возможно?

Edit: я знаю, что могу обновить интервал при котором Chrome перезагружает расширения, что является половинчатым решением, но я бы предпочел либо сделать мой редактор (emacs или textmate) триггером для сохранения перезагрузки, либо попросить Chrome отслеживать каталог для изменений.

22 208

22 ответа:

можно использовать "Расширения Перегружатель" для Chrome:

перезагружает все распакованные расширения, используя кнопку панели инструментов расширения или перейдя к"http://reload.расширения"

Если вы когда-либо разрабатывали расширение Chrome, вы могли бы захотеть автоматизируйте процесс перезагрузки распакованного расширения без использования нужно пройти через страницу расширений.

"Extensions Reloader" позволяет перезагрузить все распакованные расширения используя 2 способа:

1-кнопка панели инструментов расширения.

2 - просмотре "http://reload.расширения".

значок панели инструментов перезагрузит распакованные расширения одним щелчком мыши.

"перезагрузка при просмотре" предназначена для автоматизации процесса перезагрузки использование скриптов "post build" - просто добавьте обзор "http://reload.расширения " используя Chrome для вашего скрипта, и вы будете есть обновленное окно Chrome.

обновление: по состоянию на 14 января 2015 года, расширение является открытым исходным кодом и доступно на GitHub.

обновление: я добавил страницу параметров, так что вам больше не нужно вручную находить и редактировать идентификатор расширения. CRX и исходный код находятся по адресу:https://github.com/Rob--W/Chrome-Extension-Reloader
Обновление 2: Добавлен ярлык (см. мой репозиторий на Github).
исходный код, который включает в себя основные возможности показано ниже.


создать расширение и использовать Действие Браузера метод в сочетании с chrome.extension.management API для перезагрузки распакованного расширения.

приведенный ниже код добавляет кнопку в Chrome,которая будет перезагружать расширение при нажатии.

manifest.json

{
    "name": "Chrome Extension Reloader",
    "version": "1.0",
    "manifest_version": 2,
    "background": {"scripts": ["bg.js"] },
    "browser_action": {
        "default_icon": "icon48.png",
        "default_title": "Reload extension"
    },
    "permissions": ["management"]
}

bg.js

var id = "<extension_id here>";
function reloadExtension(id) {
    chrome.management.setEnabled(id, false, function() {
        chrome.management.setEnabled(id, true);
    });
}
chrome.browserAction.onClicked.addListener(function(tab) {
    reloadExtension(id);
});

icon48.png: выберите любой хороший значок 48x48, например:
Google Chrome http://icons.iconarchive.com/icons/google/chrome/48/Google-Chrome-icon.png Google Chrome

в любой функции или событии

chrome.runtime.reload();

перезагрузит ваше расширение. Вам также необходимо изменить манифест.json и добавил:

...
"permissions": [ "management" , ...]
...

Я сделал простой встраиваемый скрипт, выполняющий горячую перезагрузку:

https://github.com/xpl/crx-hotreload

Он следит за изменениями файлов в каталоге расширения. При обнаружении изменения он перезагружает расширение и обновляет активную вкладку (для повторного запуска обновленных сценариев содержимого).

  • работает путем проверки временных меток файлов
  • поддерживает вложенные каталоги
  • автоматически отключает сам в производственной конфигурации

другим решением было бы создать пользовательский скрипт livereload (extension-reload.js):

// Reload client for Chrome Apps & Extensions.
// The reload client has a compatibility with livereload.
// WARNING: only supports reload command.

var LIVERELOAD_HOST = 'localhost:';
var LIVERELOAD_PORT = 35729;
var connection = new WebSocket('ws://' + LIVERELOAD_HOST + LIVERELOAD_PORT + '/livereload');

connection.onerror = function (error) {
  console.log('reload connection got error:', error);
};

connection.onmessage = function (e) {
  if (e.data) {
    var data = JSON.parse(e.data);
    if (data && data.command === 'reload') {
      chrome.runtime.reload();
    }
  }
};

этот скрипт подключается к серверу livereload с помощью websockets. Затем он выпустит chrome.во время выполнения.reload () вызовите сообщение о перезагрузке из livereload. Следующим шагом будет добавление этого сценария для запуска в качестве фонового сценария в манифесте.джсон, и вуаля!

Примечание: это не мое решение. Я просто публикую его. Я нашел его в сгенерированном коде Chrome Генератор расширения (отличный инструмент!). Я публикую это здесь, потому что это может помочь.

расширения Chrome имеют система разрешение что это не позволит ему (некоторые люди так была та же проблема, что и вы), поэтому просить их "добавить эту функцию" не будет работать IMO. Есть почта от расширений Chromium Google Groups с предлагаемое решение (теория) используя chrome.extension.getViews(), но не гарантированно работает.

если бы можно было добавить к manifest.json некоторые внутренние страницы Chrome, такие как chrome://extensions/, это было можно создать плагин, который будет взаимодействовать с Reload якорь, и, используя внешнюю программу как XRefresh (плагин Firefox-есть версия Chrome используя Ruby и WebSocket), вы достигнете именно того, что вам нужно:

XRefresh-это плагин для браузера, который обновить текущую веб-страницу из-за изменение файлов в выбранных папках. Этот позволяет сделать живую страницу редактирование с помощью вашего любимого HTML / CSS редактор.

это невозможно сделать, но я думаю, что вы можете использовать эту же концепцию по-другому.

вместо этого вы можете попробовать найти сторонние решения, которые, увидев изменения в файле (я не знаю emacs ни Textmate, но в Emacs можно было бы привязать вызов приложения в действии "сохранить файл"), просто нажимает на определенную координату конкретного приложения: в этом случае это Reload якорь от вашего расширения в разработка (вы оставляете окно Chrome открытым только для этой перезагрузки).

(сумасшедший, как ад, но это может сработать)

вот функция, которую вы можете использовать для просмотра файлов для изменений и перезагрузки, если изменения обнаружены. Он работает, опрашивая их через AJAX и перезагружая через окно.местоположение.перезаряжать.)( Я полагаю, вы не должны использовать это в дистрибутив.

function reloadOnChange(url, checkIntervalMS) {
    if (!window.__watchedFiles) {
        window.__watchedFiles = {};
    }

    (function() {
        var self = arguments.callee;
        var xhr = new XMLHttpRequest();

        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                if (__watchedFiles[url] &&
                    __watchedFiles[url] != xhr.responseText) {
                    window.location.reload();
                } else {
                    __watchedFiles[url] = xhr.responseText
                    window.setTimeout(self, checkIntervalMS || 1000);
                }
            }
        };

        xhr.open("GET", url, true);
        xhr.send();
    })();
}

reloadOnChange(chrome.extension.getURL('/myscript.js'));

может быть, я немного опоздал на вечеринку, но я решил это для меня, создав https://chrome.google.com/webstore/detail/chrome-unpacked-extension/fddfkmklefkhanofhlohnkemejcbamln

он работает путем перезагрузки chrome://extensions страница, когда file.change события поступают через websockets.

глоток на основе пример того, как испускать file.change событие при изменении файла в папке расширений можно найти здесь: https://github.com/robin-drexler/chrome-extension-auto-reload-watcher

зачем перезагружать всю вкладку вместо того, чтобы просто использовать api управления расширениями для перезагрузки/повторного включения расширений? В настоящее время отключение и включение расширений снова вызывает любое открытое окно проверки (журнал консоли и т. д.) закрыть, что я нашел слишком раздражающим во время активного развития.

ваши файлы контента, такие как html и файлы манифеста, не могут быть изменены без установки расширения, но я считаю, что файлы JavaScript динамически загружаются до тех пор, пока расширение не будет упаковано.

Я знаю это из-за текущего проекта im, работающего через API расширений Chrome, и, кажется, загружается каждый раз, когда я обновляю страницу.

может быть, немного поздний ответ, но я думаю crxreload может работать для вас. Это мой результат попытки иметь рабочий процесс перезагрузки при сохранении во время разработки.

использовать npm init для создания пакета.json в корневом каталоге, затем

npm install --save-dev gulp-open && npm install -g gulp

затем создать gulpfile.js

который выглядит как:

/* File: gulpfile.js */

// grab our gulp packages
var gulp  = require('gulp'),
    open = require('gulp-open');

// create a default task and just log a message
gulp.task('default', ['watch']);

// configure which files to watch and what tasks to use on file changes
gulp.task('watch', function() {
  gulp.watch('extensionData/userCode/**/*.js', ['uri']);
});

gulp.task('uri', function(){
  gulp.src(__filename)
  .pipe(open({uri: "http://reload.extensions"}));
});

это работает для меня, разрабатывая с CrossRider, вы можете посмотреть, чтобы изменить путь, по которому вы смотрите файлы, также предполагая, что у вас установлен npm и узел.

благодаря @GmonC и @Arik и некоторому свободному времени, мне удается заставить это работать. Мне пришлось изменить два файла, чтобы сделать эту работу.

(1) Установите LiveReload и расширение Chrome для этого приложения. Это вызовет некоторый скрипт на изменение файла.

(2) Откройте <LiveReloadInstallDir>\Bundled\backend\res\livereload.js

(3) изменить строку #509 до

this.window.location.href = "http://reload.extensions";

(4) Теперь установите другое расширение Extensions Reloader который имеет полезный обработчик ссылок, который перезагружает всю разработку расширения для перехода к "http://reload.extensions"

(5) теперь измените это расширение background.min.js таким образом

if((d.installType=="development")&&(d.enabled==true)&&(d.name!="Extensions Reloader"))

заменить на

if((d.installType=="development")&&(d.enabled==true)&&(d.name!="Extensions Reloader")&&(d.name!="LiveReload"))

Откройте приложение LiveReload, скройте кнопку перезагрузки расширения и активируйте расширение LiveReload, нажав на кнопку на панели инструментов, теперь вы перезагрузите страницу и расширения при каждом изменении файла, используя все другие лакомства из LiveReload (css reload, image reload и т. д.)

только плохо об этом разве что вам придется повторять процедуру смены скриптов при каждом обновлении расширения. Чтобы избежать обновлений, добавьте расширение как распакованное.

когда у меня будет больше времени, чтобы возиться с этим, я, вероятно, создам расширение, которое устраняет необходимость в обоих этих расширениях.

до тех пор, я работаю над моим расширением Projext Axeman

я раскошелился LiveJS чтобы обеспечить живую перезагрузку упакованных приложений. Просто включите файл в свое приложение, и каждый раз, когда вы сохраняете файл, приложение будет автоматически загружаться.

Как уже упоминалось в документах: следующая командная строка перезагрузит приложение

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --load-and-launch-app=[path to the app ]

поэтому я просто создал сценарий оболочки и вызвал этот файл из gulp. Супер просто:

var exec = require('child_process').exec;



gulp.task('reload-chrome-build',function(cb){

console.log("reload");

var cmd="./reloadchrome.sh"

exec(cmd,function (err, stdout, stderr) {
    console.log("done: "+stdout);

    cb(err);
    }
);});

запустите необходимые команды watch в сценариях и вызовите задачу перезагрузки, когда захотите. Чисто, просто.

Это где программное обеспечение, такое как AutoIt или альтернативы блеск. Ключ-это написание скрипта, который эмулирует ваш текущий этап тестирования. Привыкайте использовать хотя бы один из них, так как многие технологии не имеют четких путей рабочего процесса/тестирования.

Run("c:\Program Files (x86)\Google\Chrome\Application\chrome.exe")
WinWaitActive("New Tab - Google Chrome")
Send("^l")
Send("chrome://extensions{ENTER}")
WinWaitActive("Extensions - Google Chrome")
Send("{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}")
Send("{ENTER}")
WinWaitActive("Extensions - Google Chrome")
Send("{TAB}{TAB}")
Send("{ENTER}")
WinWaitActive("Developer Tools")
Send("^`")

очевидно, вы меняете код в соответствии с вашими потребностями тестирования/итерации. Убедитесь, что клики по вкладкам верны тому, где находится тег привязки на сайте chrome: / / extensions. Вы также можете использовать относительно движений мыши окна и других такие макросы.

Я бы добавил скрипт в Vim способом, подобным этому:

map <leader>A :w<CR>:!{input autoit loader exe here} "{input script location here}"<CR>

Это означает, что когда я нахожусь в Vim, я нажимаю кнопку выше ENTER (обычно отвечающую за: | и\), известную как кнопка лидера, и следую за ней с большой буквы "A", и она сохраняет и начинает мой сценарий фазы тестирования.

пожалуйста, не забудьте заполнить {input...} разделы в приведенном выше скрипте Vim / hotkey соответствующим образом.

многие редакторы позволят вам что-то сделать аналогично с горячими клавишами.

альтернативы программы можно найти здесь.

Для Windows: AutoHotkey

для Linux: xdotool, xbindkeys

Для Mac: Automator

Если у вас есть Mac, ¡самый простой способ-это приложение Alfred!

просто сделать Альфред приложение с Powerpack, затем добавьте рабочий процесс, указанный в ссылке ниже, и настройте горячую клавишу, которую вы хотите (мне нравится использовать ⌘ + ⌥ + R). Вот и все.

теперь, каждый раз, когда вы используете горячие клавиши, Google Chrome перезагрузится, независимо от того, какое приложение вы находитесь в этот момент.

Если вы хотите использовать другой браузер, откройте AppleScript внутри Alfred Preferences Workflows and replace " Google Chrome "with" Firefox"," Safari",...

Я также покажу здесь контент / usr/bin / osascript скрипт в ReloadChrome.файл alfredworkflow так что вы можете видеть, что он делает.

tell application "Google Chrome"
  activate
  delay 0.5
  tell application "System Events" to keystroke "r" using command down
  delay 0.5
  tell application "System Events" to keystroke tab using command down
end tell

файл рабочего процесса ReloadChrome.alfredworkflow.

Я хочу перезагрузить (обновить) мои расширения в одночасье, это то, что я использую в фоновом режиме.js:

var d = new Date();
var n = d.getHours();
var untilnight = (n == 0) ? 24*3600000 : (24-n)*3600000; 
// refresh after 24 hours if hour = 0 else
// refresh after 24-n hours (that will always be somewhere between 0 and 1 AM)
setTimeout(function() {
    location.reload();
}, untilnight);

С уважением, Питер

отказ от ответственности:я сам разработал это расширение.

Clerc - для клиента перезагрузки Chrome Live Extension

подключитесь к серверу, совместимому с LiveReload, чтобы автоматически перезагружать расширение при каждом сохранении.

бонус: с небольшой дополнительной работой с вашей стороны, вы также можете автоматически перезагрузить веб-страницы, которые ваше расширение изменяет.

большинство разработчиков веб-страниц используют систему сборки с некоторым видом наблюдателя, который автоматически создает свои файлы и перезагружает свой сервер и перезагружает веб-сайт.

разработка расширений не должна быть такой разной. Клер приносит этот же автоматизации хром разработчики. Установите систему сборки с сервером LiveReload, и Clerc будет прослушивать события перезагрузки для обновления вашего расширения.

единственная большая проблема-это изменения в манифесте.формат JSON. Любые крошечные опечатки в манифесте, вероятно, вызовут дальнейшие попытки перезагрузки, и вы будете застряли удаление / переустановка расширения, чтобы получить ваши изменения загрузки снова.

Clerc пересылает сообщение полной перезагрузки на ваш модуль после его перезагрузки, поэтому вы можете дополнительно использовать предоставленное сообщение для запуска дальнейших шагов обновления.

Я в первую очередь разрабатываю в Firefox, где web-ext run автоматически перезагружает расширение после изменения файлов. Затем, как только он будет готов, я сделаю последний раунд тестирования в Chrome, чтобы убедиться, что нет никаких проблем, которые не появились в Firefox.

Если вы хотите развиваться в первую очередь в Chrome, хотя и не хотите устанавливать какие-либо сторонние расширения, то другой вариант-создать test.html файл в папке расширения, и добавить кучу SSCCE к нему. Что затем файл использует обычный <script> тег для вставки сценария расширения.

вы можете использовать это для 95% тестирования, а затем вручную обновить расширение, когда вы хотите протестировать его на живых сайтах.

Это не тождественно воспроизводит среду, в которой работает расширение, но это достаточно хорошо для многих простых вещей.

Да,вы можете сделать это косвенно! Вот мое решение.

в манифесте.json

{
    "name": "",
    "version": "1.0.0",
    "description": "",
    "content_scripts":[{
        "run_at":"document_end",
        "matches":["http://*/*"],
        "js":["/scripts/inject.js"]
    }]
}

In inject.js

(function() {
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.async = true;
    script.src = 'Your_Scripts';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(script, s);
})();

ваш введенный скрипт может вводить другой скрипт из любого места.

еще одно преимущество этой техники заключается в том, что вы можете просто игнорировать ограничение изолированный мир. смотрите среда выполнения скрипта контента

Это не может быть сделано напрямую. Извиняюсь.

Если вы хотите видеть его в качестве функции, вы можете запросить его в http://crbug.com/new