NPM(节点包管理器)注册表使用CouchDB在http://registry.npmjs.org/registry的CouchDB实例上存储包的元信息和tar包。我使用以下复制文档(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"]
)并再次开始复制。
此不起作用:复制立即完成,我想要添加到复制的软件包(在本例中为"npm"
)丢失。
[我知道的解决方法是删除目标数据库,再次复制 - 因为我也使用这个本地注册表来发布我的专有包 - 重新发布我的本地包。 叹息
修正案18.11.2011
这就是我认为会发生什么(根本不是CouchDB内部专家,但可能有一些道理):
第一次成功复制后,CouchDB将它复制的最新文档的最后一个(最高?)序列ID 存储在数据库中的隐藏文档中(我曾经知道如何访问它们,欢迎指针)。然后,当我更改doc_ids
时,此缓存的有关上次成功复制的信息(序列ID)未被无效(或清除)。然后,当它被告知使用相同的数据库再次复制时,它会比较序列ID 并确定一切正常。
答案 0 :(得分:1)
1)
http://registry.npmjs.org/registry
不是注册表数据库,但http://registry.npmjs.org
是。
2)
{“_ id”:“fetch-npm-registry”,“doc_ids”:[“coffee-script”, “nodeunit”],“source”:“http://couchdb.mycompany.com:5984/registry”, “target”:“registry”,}
您确定要从http://couchdb.mycompany.com:5984/registry
而不是http://registry.npmjs.org
复制吗?
答案 1 :(得分:0)
我尝试使用Couchbase Single Server 2.0 Developer Preview 5.它有效。我的curl命令是(但需要几分钟):
curl -X POST 'http://localhost:5984/_replicate' -H 'Content-Type: application/json' -d '{"doc_ids": [ "coffee-script", "nodeunit", "npm" ], "source": "http://registry.npmjs.org:5984/registry", "target": "registry", "create_target": true}
它基于一些Apache COuchDB主干版本。
请问您可以尝试使用Apache CouchDB 1.1.1。我记得有一个带有空ID的复制器错误(并且npm存储库有这样的文档),这是固定的。
干杯, 沃尔克