如何使Composer从本地存储库自动安装包的所有依赖项?



我在Ubuntu上使用Composer 1.6.3,并有以下全局~/.config/composer/config.json文件:

{
"config": {},
"repositories": {
"packagist": false,
"codifier": {
"type": "composer",
"url": "file:///usr/local/codifier/library/PHP/Codifier"
}
}
}

换句话说,我禁用Packagist并指向本地机器上我自己的存储库。这个本地存储库有一个packages.json定义所有可用的本地包:

{
"packages": {
"codifier/cache": {
"dev-master": {
"name": "codifier/cache",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Cache",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/cache",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Cache",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/environment": {
"dev-master": {
"name": "codifier/environment",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Environment",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/environment",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Environment",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/event": {
"dev-master": {
"name": "codifier/event",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Event",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/event",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Event",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/mime": {
"dev-master": {
"name": "codifier/mime",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Mime",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/mime",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Mime",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/net": {
"dev-master": {
"name": "codifier/net",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Net",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/net",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Net",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/number": {
"dev-master": {
"name": "codifier/number",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Number",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/number",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Number",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/persistence": {
"dev-master": {
"name": "codifier/persistence",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Persistence",
"type": "git",
"reference": "master"
}
},
"0.1.0": {
"name": "codifier/persistence",
"version": "0.1.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Persistence",
"type": "git",
"reference": "v0.1.0"
}
}
},
"codifier/process": {
"dev-master": {
"name": "codifier/process",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Process",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/process",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Process",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/socket": {
"dev-master": {
"name": "codifier/socket",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Socket",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/socket",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Socket",
"type": "git",
"reference": "v1.0.0"
}
}
},
"codifier/stdlib": {
"dev-master": {
"name": "codifier/stdlib",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/StdLib",
"type": "git",
"reference": "master"
}
},
"0.1.0": {
"name": "codifier/stdlib",
"version": "0.1.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/StdLib",
"type": "git",
"reference": "v0.1.0"
}
}
},
"codifier/text": {
"dev-master": {
"name": "codifier/text",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Text",
"type": "git",
"reference": "master"
}
},
"1.0.0": {
"name": "codifier/text",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Text",
"type": "git",
"reference": "v1.0.0"
}
}
}
}
}
到目前为止,这部分按预期工作。当我在一个随机文件夹中执行$ composer show -a时,我得到这样的输出:
No composer.json found in the current directory, showing available packages from codifier
codifier/cache      
codifier/environment
codifier/event      
codifier/mime       
codifier/net        
codifier/number     
codifier/persistence
codifier/process    
codifier/socket     
codifier/stdlib     
codifier/text

所有这些包都定义了它们自己的依赖关系。例如,codifier/socket包在其根目录中有以下composer.json文件:

{
"name": "codifier/socket",
"authors": [ ##REDACTED## ],
"require": {
"php": ">=7.3.0",
"codifier/event": "^1.0",
"codifier/net": "^1.0",
"codifier/process": "^1.0"
},
"autoload": {
"psr-4": {
"Codifier\Socket\": "src"
}
}
}

现在,我认为Composer的全部意义在于它会自动和递归地安装所有必需的依赖,而不是我必须再次手动require所有依赖,但情况似乎并非如此。

当我创建一个新的干净的应用程序目录$ mkdir Test && cd Test,然后执行$ composer require codifier/socket,我得到这样的输出:

Using version ^1.0 for codifier/socket
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing codifier/socket (1.0.0): Cloning v1.0.0 from cache
Writing lock file
Generating autoload files

…然后当我执行$ composer install时,我得到这个输出:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files

换句话说,只安装codifier/socket而不安装它的依赖项。因此,Test/vendor的内容现在是:

- codifier/
- socket/

…当我期望内容是:

- codifier/
- socket/
- event/
- net/
- process/
etc.

…因为我希望Composer能够递归地获取所有需要的依赖项。

我也尝试过$ composer clear-cache,但这并没有什么不同,我想我也看到过一些帖子建议我需要在composer.json内定义"repositories"这个应用程序,但这对我来说没有任何意义,因为我已经指出了那些在我的全局config.json文件。

我在这里错过了什么?我是否错过了Composer的要点,因为我认为它会自动解析和安装所有需要的依赖项?

,——

我现在也尝试通过我的本地web服务器服务包(并相应地更改json文件中的所有"url"字段,当然),因为我认为也许Composer无法正确处理file://协议,但无济于事:它给出了完全相同的结果:它只安装codifier/socket,只是忽略了它的依赖关系。

我不知道我还需要做什么才能使这个本地packages.json存储库工作。

我刚刚灵光一闪,终于找到了让它工作的方法,但感觉很多余。我让它工作的方式是简单地将"require"信息从包的composer.json文件复制到我的存储库的packages.json文件。

再次以codifier/socket包中的composer.json文件为例:

{
"name": "codifier/socket",
"authors": [ ##REDACTED## ],
"require": {
"php": ">=7.3.0",
"codifier/event": "^1.0",
"codifier/net": "^1.0",
"codifier/process": "^1.0"
},
"autoload": {
"psr-4": {
"Codifier\Socket\": "src"
}
}
}

…在packages.json中,它的相关信息将变成:

{
"packages": {
...
"codifier/socket": {
"dev-master": {
"name": "codifier/socket",
"version": "dev-master",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Socket",
"type": "git",
"reference": "master"
},
"require": {
"php": ">=7.3.0",
"codifier/event": "^1.0",
"codifier/net": "^1.0",
"codifier/process": "^1.0"
}
},
"1.0.0": {
"name": "codifier/socket",
"version": "1.0.0",
"source": {
"url": "file:///usr/local/codifier/library/PHP/Codifier/Socket",
"type": "git",
"reference": "v1.0.0"
},
"require": {
"php": ">=7.3.0",
"codifier/event": "^1.0",
"codifier/net": "^1.0",
"codifier/process": "^1.0"
}
}
},

...
}
}

当我对所有包应用此方法时,一切都很顺利。

我仍然不明白的是,为什么Composer没有从包本身的实际composer.json中拾取这个"require"信息。我知道文档说明Composer不会递归地遵循存储库,但它肯定必须递归地遵循依赖项,不是吗?然而,也许它根本没有,这只是它的工作方式。

这意味着我将不得不做更多的git解析来获得每个单独版本的包的正确数据,但就这样吧。这个解决方案可能还会引导我找到自动加载问题的解决方案,在这个问题中,composer.json中定义的"autoload"名称空间也没有被选中。我下次再试一下,如果这样也能解决问题,我就修改一下这个答案。

,——

不出所料:当我将"autoload"信息并入packages.json时,自动加载也开始工作了。


1)我已经知道了Satis,但我不想再安装和学习另一个软件。

最新更新