Сохраняйте тот же идентификатор при преобразовании из пользовательского скрипта в Chrome

В настоящее время я обновляю пользовательский скрипт для расширения Chrome, но, поскольку новый идентификатор отличается, он не будет обновлять старое расширение, а добавит новое.

Есть ли способ преобразовать пользовательский скрипт в расширение Chrome и сохранить тот же идентификатор?

Поскольку для пользовательского скрипта нет ключевого файла, я думаю, что это возможно,
но как?


person user3    schedule 02.08.2012    source источник


Ответы (1)


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

  1. Установите пользовательский скрипт.
  2. Посетите chrome://extensions/ и активируйте режим разработчика.
  3. Прокрутите вниз до пользовательского сценария и найдите идентификатор: Userscript 1.0 Описание идентификатора пользовательского сценария: hjcgfecgldpgebeeflnjldogphkilfdo
    Обратите внимание, что версия вашего пользовательского скрипта — 1.0 (по умолчанию переопределяется через @version).
  4. Затем перейдите в каталог расширений вашего профиля пользователя Chrome/Chromium. Пути по умолчанию можно найти здесь. Если вы запускаете Chrome/Chromium с флагом --user-data-dir=..., перейдите на страницу ....
    Когда вы окажетесь внутри каталога, найдите каталог с идентификатором 3.
  5. Скопируйте весь каталог в другое место, например /tmp/ или %tmp%.
  6. Используйте кнопку «Загрузить распакованное расширение» и выберите первый подкаталог ранее скопированного каталога: Имя этого подкаталога зависит от версии.
  7. Прокрутите вниз, чтобы увидеть, что преобразованный пользовательский скрипт является настоящим расширением (он загружается!):
    Userscript 1.0 Описание пользователя  ID сценария: hjcgfecgldpgebeeflnjldogphkilfdo Загружено из: /tmp/hjcgfecgldpgebeeflnjldogphkilfdo/1.0_0

Хорошо, шаги 6-7 необязательны, они были включены только для того, чтобы показать, что пользовательский скрипт преобразуется в истинное расширение с установленным специальным флагом. Вы также можете заметить красное предупреждение о версии манифеста. Чтобы исправить это, отредактируйте manifest.json и добавьте "manifest_version": 2,. Итак, в нашем случае:

    ...
    "converted_from_user_script": true,
    "description": "Description of user script",
    "key": "eYxnPzfSPtfL3ji4nQX3ujTXpzz3YQ6dVlvHWf1gvW8=",
    "name": "Userscript",
    "version": "1.0",
    "manifest_version": 2
}

Теперь у вас есть расширение Chrome, которое ведет себя как расширение Chrome с некоторым дополнительным вкусом. Следуйте инструкциям из официальной документации, чтобы обновить свой пакет:

Обновление пакета

Чтобы создать обновленную версию расширения:

  1. Увеличьте номер версии в manifest.json.
  2. Откройте страницу управления расширениями, перейдя по этому URL-адресу: chrome://extensions.
  3. Нажмите кнопку Упаковать расширение. Появится диалоговое окно.
  4. В поле Корневой каталог расширения укажите путь к папке расширения, например, c:\myext.
  5. В поле Файл закрытого ключа укажите расположение уже созданного файла .pem для этого расширения, например, c:\myext.pem.
  6. Нажмите ОК.

Загрузка ранее упакованного расширения в Интернет-магазин Chrome

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

Если вы хотите сохранить идентификатор расширения, выполните следующие действия:

  1. Переименуйте закрытый ключ, сгенерированный при создании файла .crx, в key.pem.
  2. Поместите key.pem в верхний каталог вашего расширения.
  3. Сожмите этот каталог в ZIP-файл.
  4. Загрузите ZIP-файл с помощью панели инструментов разработчика Chrome.

Приложение: Сохранение одного и того же ID в распакованных/упакованных расширениях.

Идентификатор расширения можно контролировать с помощью параметра "key" в файле манифеста. Самый простой способ иметь одинаковый ID для распакованного и упакованного расширения также указан в документации:

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

Примечание. Обычно вам не нужно использовать это значение. Вместо этого напишите свой код так, чтобы значение ключа не имело значения, используя относительные пути. и chrome.extension.getURL().

Чтобы получить подходящее значение ключа, сначала установите расширение из файла .crx (может потребоваться загрузить ваше расширение или упакуйте его вручную). Затем в своем каталоге пользовательских данных найдите файл Default/Extensions/<extensionId>/<versionString>/manifest.json. Вы увидите значение ключа, заполненное там.

Если поле key не существует, оно генерируется случайным образом. Затем из этого ключа генерируется идентификатор расширения. Алгоритм создания extensionID объяснен здесь. В силу особенностей алгоритма вы не можете выполнить его в обратном порядке (extensionID -> key).

person Rob W    schedule 02.08.2012
comment
Спасибо за ваш ответ, но это не решило мою проблему. Когда я загружаю расширение без упаковки, оно сохраняет тот же идентификатор, но когда я пытаюсь его упаковать, идентификатор меняется, есть идеи, как его сохранить? - person user3; 23.08.2012
comment
@ user3 Я предполагаю, что вы имеете в виду разницу идентификаторов между упакованным и распакованным расширением? Если да, я расширил свой ответ этим битом. Если нет, убедитесь, что вы используете тот же закрытый ключ для упаковки расширения. - person Rob W; 23.08.2012
comment
@ user3 Обновленный ответ решил вашу проблему? Если нет, то что не так? - person Rob W; 05.09.2012
comment
Это не решило мою проблему, но заставило меня понять, что это просто невозможно ^^ Потому что, чтобы делать то, что я хотел, я должен создать закрытый ключ, соответствующий значению ключа, что (я думаю) невозможно. - person user3; 06.09.2012