Реестр NPM (менеджер пакетов узлов) использует CouchDB для хранения метаинформации и архивных пакетов в экземпляре CouchDB по адресу http://registry.npmjs.org/registry .. Я использую следующий документ репликации (CouchDB 1.1.0) для репликации подмножествареестр моего корпоративного CouchDB:
{
"_id": "fetch-npm-registry",
"doc_ids": [
"coffee-script",
"nodeunit"
],
"source": "http://couchdb.mycompany.com:5984/registry",
"target": "registry",
}
[Кстати, CouchApp обрабатывает это в https://github.com/isaacs/npmjs.org (также с полными инструкциями по установке)].
Если я хочу добавить еще одну зависимость в один из моих пакетов, моя наивная мысль заключалась в том, чтобы я просто изменил список doc_ids
(скажем, на ["coffee-script", "nodeunit", "npm"]
) и снова начал репликацию.
This однако не работает : репликация немедленно завершается, и пакет, который я хотел добавить к репликации (в данном случае "npm"
), отсутствует.
[Обходной путь, известный мне, заключается вудалите целевую базу данных, повторите репликацию и - поскольку я также использую этот локальный реестр для публикации своих проприетарных пакетов - повторно опубликую мои локальные пакеты. вздох ]
Поправка 18.11.2011
Вот то, что я думаю, что происходит (совсем не эксперт по внутренним компонентам CouchDB, но, возможно,в этом есть доля правды):
После первой успешной репликации CouchDB сохраняет последний (самый высокий?) Идентификатор последовательности самого последнего документа, который он реплицировал, в скрытом документе в базе данных (Когда-то я знал, как получить доступ к ним, указатели приветствуются).Затем, когда я изменяю doc_ids
, эта кэшированная информация о последней успешной репликации (идентификатор последовательности) не аннулируется (или не очищается).Затем, когда ему велят повторить репликацию с той же базой данных, он сравнивает идентификаторы последовательностей и решает, что все в порядке.