簡體   English   中英

作曲家需要本地 package

[英]Composer require local package

我有幾個庫 [Foo 和 Bar] 我正在共同開發,但在技術上仍然是獨立的東西。 以前我剛剛將自動加載器重新定義為喜歡"Foo\\": "../Foo/src" ,但現在我已經向 Foo 添加了 Guzzle 依賴項,Bar 翻轉它的蓋子,因為它不是它的一個依賴關系。

目錄結構:

/home/user/src/
    Foo/
        src/
            FooClient.php
        composer.json
    Bar/
        src/
            BarClient.php
        composer.json

理論自動加載聲明:[在 Bar/composer.json]

"require": {
    "local": "../Foo/composer.json"
}

示例代碼:

require('vendor/autoload.php');

$f = new \Bar\BarClient(new \Foo\FooClient());

如何在不設置本地 Composer 存儲庫的情況下解決此問題? 我想將這些作為單獨的包進行維護,只是一個需要另一個,因此處理另一個的依賴項。

回答后編輯:

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

初始化 git 存儲庫:

cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"

添加了作曲家配置:

"require": {
    "sammitch/foo": "dev-master"
},
"repositories": [{
    "type": "vcs",
    "url": "/home/sammitch/src/Foo"
}],

然后composer update

鏈接到本地​​開發包的方法是首先在主項目的composer.json一個存儲庫,如下所示:

"repositories": [
    {
        "type": "path",
        "url": "/full/or/relative/path/to/development/package"
    }
]

您還需要在開發包的composer.json指定一個版本,或者我這樣做的方式是使用@dev要求包,如下所示:

composer require "vendorname/packagename @dev"

它應該輸出:

- Installing vendor/packagename (dev-develop)
Symlinked from /full/or/relative/path/to/development/package

require 命令中的@dev很重要,composer 使用它來獲取源代碼並將其符號鏈接到您的新包。

這是添加到版本約束的穩定性標志(參見包鏈接)。

這些允許您進一步限制或擴展包的穩定性超出最小穩定性設置的范圍。

最低穩定性標志是:

可用選項(按穩定性排序)是devalphabetaRCstable

您可以使用 Composer 的存儲庫功能

https://getcomposer.org/doc/05-repositories.md#path

{
  "repositories": [
    {
        "type": "path",
        "url": "../../packages/my-package"
    }
  ],
  "require": {
    "my/package": "*"
  }
}

不使用 http 格式,而是指定磁盤上的文件路徑。

花了一些時間,我終於明白了解決方案。 也許它對像我這樣的人有用並且會為您節省一些時間,所以我決定必須在這里分享。

假設您具有以下目錄結構(相對於您的項目根目錄):

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

在此示例中,您可能會看到local文件夾用於您公司的嵌套項目,例如bar-project 但是,如果您願意,您可以配置任何其他布局。

每個項目都必須有自己的composer.json文件,例如 root composer.jsonlocal/bar-project/composer.json 那么它們的內容如下:

(根composer.json .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"
    }
  ]
}

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

{
  "name": "your-company/bar-project",
  "autoload": {
    "psr-4": {
      "YourCompany\\BarProject\\": "src/"
    }
  }
}

例如,如果您希望將每個項目定位在單獨的同級目錄中,如下所示:

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

- 然后您需要鏈接到repositories部分中的相應目錄:

  "repositories": [
    {
      "type": "path",
      "url": "../bar-project"
    }
  ]

之后不要忘記composer update (甚至rm -rf vendor && composer update -v正如文檔所建議的那樣)! 在幕后,composer 將創建一個vendor/your-company/bar-project符號鏈接,目標是local/bar-project (或分別為../bar-project )。

假設您的public/index.php只是一個front controller ,例如:

<?php
require_once __DIR__ . '/../config/composition-root.php';

那么你的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();

執行此操作的命令行方法是

composer config repositories.package_name local path/to/package
composer require group/package_name

如果 group/package_name 在存儲庫和本地都可用,則使用本地版本。

local命令可以替換為 vcs 以引用直接存儲庫,或默認為composer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM