我已经分叉了 https://github.com/jasonlewis/basset,现在正在尝试将我的分叉添加到我的项目中。但是在我运行composer update
后,它似乎没有读取我的分叉composer.json
文件,为什么?我做错了什么?
我在require: {}
之后添加了这个repository
:
"repositories": [
{
"type":"package",
"package": {
"name": "marwelln/basset",
"version":"master",
"source": {
"url": "https://github.com/Marwelln/basset.git",
"type": "git",
"reference":"master"
}
}
}
],
我的分叉composer.json
如下所示(除了名称外,与原始内容没有任何变化):
{
"name": "marwelln/basset",
"description": "A better asset management package for Laravel.",
"keywords": ["assets", "basset", "laravel"],
"license": "BSD-2-Clause",
"authors": [
{
"name": "Jason Lewis",
"email": "jason.lewis1991@gmail.com"
}
],
"require": {
"php": ">=5.3.0",
"kriswallsmith/assetic": "1.1.*"
},
"require-dev": {
"mockery/mockery": ">=0.7.2",
"illuminate/config": "4.0.*",
"illuminate/console": "4.0.*",
"illuminate/filesystem": "4.0.*",
"illuminate/log": "4.0.*",
"illuminate/routing": "4.0.*",
"illuminate/support": "4.0.*",
"symfony/process": "2.3.*"
},
"suggest": {
"aws/aws-sdk-php": "Deploy static assets directly to your S3 buckets.",
"rackspace/php-cloudfiles": "Deploy static assets directly to your Cloud Files container."
},
"autoload": {
"psr-0": {
"Basset": "src/"
},
"classmap": [
"tests/Cases/FilterTestCase.php"
],
"files": ["src/helpers.php"]
},
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"minimum-stability": "dev"
}
有了这个,Basset
命名空间没有在autoload_namespace.php
注册,也没有"kriswallsmith/assetic": "1.1.*"
,但是如果我使用原始require: { "jasonlewis/basset" : "dev-master"}
它会很好地添加它。我错过了什么?
您已经做了一些被认为不是 Composer 最佳实践的事情。
首先,您应该尽量避免包含"包"类型的存储库,其中包含在哪里可以找到所需内容的所有详细信息。从长远来看,这将成为维护的噩梦。只有当您绝对确定软件的维护者自己不会包含composer.json
文件时,软件包才应包含在您的composer.json
中。文档在 http://getcomposer.org/doc/04-schema.md#repositories 上指出:
package:如果您依赖于一个不支持作曲家的项目,则可以使用包存储库内联定义包。你基本上只是内联 composer.json 对象。
这种情况在这里不适用,因为您自己维护要使用的存储库,并且应该能够放入composer.json
。
现在,Composer 支持分叉和扩展现有库然后在代码中使用它的过程,但不支持您这样做的方式。首先,您应该替换供应商的名称,因为您接管了该角色,并且您的存储库和软件应该与其他软件包区分开来。因此,将"jasonlewis/basset"重命名为"marwelln/basset"是正确的,并且仅在要引用自己的版本时才使用该名称。
现在的问题可能是,如果你分叉了一个流行的库,并且正在使用其他确实需要原始库的库,你最终会添加这两个包。这就是"替换"字段的用途:您可以在自己的composer.json
中声明您认为您的软件包能够替换原始软件。一些细节在这里: http://getcomposer.org/doc/04-schema.md#replace
我在这里详细回答了"替换"的工作原理:"替换"属性如何与作曲家一起工作?
最后,我认为您应该执行以下操作(您仍然可以更改它):
克隆原始软件,更改composer.json
以将您自己的供应商名称作为"名称",并添加"替换"为要更改的原始软件的版本。您可能应该严格要求版本,因为您实际上只替换您知道的版本。如果以后您仍然知道您替换了较新版本,则可以更改"替换"信息。
然后,您必须像以前一样添加自己的存储库,并要求软件名称与您自己的供应商名称一起使用。
您可能在某个时间点执行了大部分操作,但是添加替换信息的步骤是缺少的链接。
我把repository
改成这样:
"repositories": [
{
"type":"vcs",
"url": "https://github.com/Marwelln/basset"
}
],
然后用jasonlewis/basset
代替marwelln/basset
.它现在正在正常工作。