Composer需要本地包

Sam*_*tch 89 php composer-php

我有几个库[Foo和Bar]我正在开发音乐会,但在技术上仍然是独立的东西.以前我刚刚重新定义了自动加载器"Foo\\": "../Foo/src",但是现在我已经为Foo添加了一个Guzzle依赖项,Bar翻转它的盖子,因为它不是它的依赖项之一.

目录结构:

/home/user/src/
    Foo/
        src/
            FooClient.php
        composer.json
    Bar/
        src/
            BarClient.php
        composer.json
Run Code Online (Sandbox Code Playgroud)

理论自动加载声明:[在Bar/composer.json]

"require": {
    "local": "../Foo/composer.json"
}
Run Code Online (Sandbox Code Playgroud)

示例代码:

require('vendor/autoload.php');

$f = new \Bar\BarClient(new \Foo\FooClient());
Run Code Online (Sandbox Code Playgroud)

如何在不设置本地Composer仓库的情况下解决此问题?我想将它们作为单独的包维护,只需要另一个包,并因此处理其他的依赖.

回答后编辑:

感谢infomaniac,我做了以下事情:

初始化git repo:

cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
Run Code Online (Sandbox Code Playgroud)

添加了作曲家配置:

"require": {
    "sammitch/foo": "dev-master"
},
"repositories": [{
    "type": "vcs",
    "url": "/home/sammitch/src/Foo"
}],
Run Code Online (Sandbox Code Playgroud)

然后composer update!

Dhi*_*pta 147

链接到本地​​开发包的方法是首先在主项目中添加composer.json一个存储库,如下所示:

"repositories": [
    {
        "type": "path",
        "url": "/full/or/relative/path/to/development/package"
    }
]
Run Code Online (Sandbox Code Playgroud)

您还需要在开发包中指定版本,composer.json或者我的方式是要求使用包@dev,如下所示:

composer require "vendorname/packagename @dev"
Run Code Online (Sandbox Code Playgroud)

它应该输出:

- Installing vendor/packagename (dev-develop)
Symlinked from /full/or/relative/path/to/development/package
Run Code Online (Sandbox Code Playgroud)

@dev在需要的命令是很重要的,作曲家用这个皮卡的源代码,并将其符号链接到您的新包.

它是一个添加到版本约束的稳定性标志(请参阅包链接).

这些允许您进一步限制或扩展包的稳定性,超出最小稳定性 设置的范围.

最小稳定性标志是:

可用的选项(在稳定的顺序)dev,alpha,beta,RC,和stable.

  • 请注意,composer不允许您指定放置composer.json的同一目录中的路径. (7认同)
  • `composer require "vendorname/packagename @dev"` 转换为 `"require":{ "vendorname/packagename": "@dev" }` 在你的应用程序的 composer.json 中,如果你想运行 composer install (7认同)
  • 请添加: composer config repositories.local path /full/or/relative/path/to/development/package 作为添加存储库的正确方法 (2认同)
  • 是否可以告诉作曲家将其安装到产品的供应商文件夹中,而不是创建符号链接? (2认同)

inf*_*iac 35

您可以使用Composer的存储库功能

https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

而不是使用http格式,请在磁盘上指定文件路径.

  • https://getcomposer.org/doc/05-repositories.md#path也很有用,似乎对我有用. (7认同)
  • 为了使其成为一个好的答案,您应该展示如何做到这一点,而不仅仅是命名功能并链接文档(尽管这也很重要)。下面的其他答案有适当的例子。 (3认同)
  • 对我来说,截至 2022 年,对于软件包版本,“@dev”比“*”更有效。 (2认同)

why*_*yer 11

花了一些时间,我终于明白了解决方案。也许它对像我这样的人有用并且可以为您节省一些时间,所以我决定必须在这里分享。

假设您具有以下目录结构(相对于您的项目根目录):

composer.json
config
config/composition-root.php
local
local/bar-project
local/bar-project/composer.json
local/bar-project/src
local/bar-project/src/Bar.php
public
public/index.php
src
src/Foo.php
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可能会看到该local文件夹用于您公司的嵌套项目,例如bar-project. 但是,如果您愿意,您可以配置任何其他布局。

每个项目都必须有自己的composer.json文件,例如 rootcomposer.jsonlocal/bar-project/composer.json. 那么它们的内容如下:

(根composer.json:)

{
  "name": "your-company/foo-project",
  "require": {
    "php": "^7",
    "your-company/bar-project": "@dev"
  },
  "autoload": {
    "psr-4": {
      "YourCompany\\FooProject\\": "src/"
    }
  },
  "repositories": [
    {
      "type": "path",
      "url": "local/bar-project"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

( local/bar-project/composer.json:)

{
  "name": "your-company/bar-project",
  "autoload": {
    "psr-4": {
      "YourCompany\\BarProject\\": "src/"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

例如,如果您希望将每个项目定位在单独的同级目录中,如下所示:

your-company
your-company/foo-project
your-company/foo-project/composer.json
your-company/foo-project/config
your-company/foo-project/config/composition-root.php
your-company/foo-project/public
your-company/foo-project/public/index.php
your-company/foo-project/src
your-company/foo-project/src/Foo.php
your-company/bar-project
your-company/bar-project/composer.json
your-company/bar-project/src
your-company/bar-project/src/Bar.php
Run Code Online (Sandbox Code Playgroud)

- 然后您需要链接到repositories部分中的相应目录:

  "repositories": [
    {
      "type": "path",
      "url": "../bar-project"
    }
  ]
Run Code Online (Sandbox Code Playgroud)

在那之后不要忘记composer update(甚至rm -rf vendor && composer update -v文档所建议的那样)!在幕后,作曲家将创建一个vendor/your-company/bar-project指向local/bar-project(或../bar-project分别)的符号链接。

假设你public/index.php只是一个front controller,例如:

<?php
require_once __DIR__ . '/../config/composition-root.php';
Run Code Online (Sandbox Code Playgroud)

那么你config/composition-root.php将是:

<?php

declare(strict_types=1);

use YourCompany\BarProject\Bar;
use YourCompany\FooProject\Foo;

require_once __DIR__ . '/../vendor/autoload.php';

$bar = new Bar();
$foo = new Foo($bar);
$foo->greet();
Run Code Online (Sandbox Code Playgroud)