Nhà soạn nhạc yêu cầu gói cục bộ


105

Tôi có một vài thư viện [Foo và Bar] mà tôi đang phát triển trong buổi hòa nhạc, nhưng vẫn là những thứ riêng biệt về mặt kỹ thuật. Trước đây tôi vừa định nghĩa lại trình tải tự động để thích "Foo\\": "../Foo/src", nhưng bây giờ tôi đã thêm phần phụ thuộc Guzzle vào Foo, Bar lật nắp nó vì nó không phải là một trong những phần phụ thuộc của nó.

Cấu trúc thư mục:

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

Tuyên bố tự động nạp lý thuyết: [trong Bar / composer.json]

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

Mã ví dụ:

require('vendor/autoload.php');

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

Làm cách nào để giải quyết vấn đề này mà không cần thiết lập repo của Nhà soạn nhạc cục bộ? Tôi muốn duy trì chúng dưới dạng các gói riêng biệt, chỉ là cái này yêu cầu cái kia và để xử lý các gói phụ thuộc của người kia.

chỉnh sửa sau câu trả lời:

Cảm ơn infomaniac, tôi đã làm những việc sau:

Đã khởi tạo repo git:

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

Đã thêm cấu hình trình soạn nhạc:

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

Và sau đó composer update!


Làm thế nào để json này xác định danh tính giữa tham chiếu đến "sammitch / foo" và địa chỉ của "/ home / sammitch / src / Foo"? Nó có tuân theo quy ước nào không?
Sebastián Grignoli

@ SebastiánGrignoli sammitch/foolà tên gói và không liên quan gì đến vị trí của nó. Sẽ xây dựng một danh sách các gói có sẵn dựa trên các repo đã định cấu hình của nó, trong trường hợp này là tìm nạp composer.json từ kho git cục bộ được chỉ định, sau đó composer xử lý phần còn lại. Các sammitch/foogói được sao chép sang ứng dụng hiện tại của vendorthư mục giống như bất kỳ gói khác.
Sammitch

Ồ, tôi nghĩ là tôi hiểu rồi. Nó chỉ là một repo tùy chỉnh, giống như trong APT, có thể chứa gói "sammit / foo". Tôi đã làm đúng chứ?
Sebastián Grignoli

@ SebastiánGrignoli bạn betcha
Sammitch

Câu trả lời:


37

Bạn có thể sử dụng tính năng kho của Composer

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

Thay vì sử dụng định dạng http, hãy chỉ định đường dẫn tệp trên đĩa.



11
getcomposer.org/doc/05-repositories.md#path cũng có khả năng hữu ích và dường như hoạt động tốt hơn đối với tôi.
Jasmine Hegman

@JasmineHegman thực sự! Tôi đã sử dụng điều đó quá - tuyệt vời cho sự phát triển
Danny Kopping

Để biến câu trả lời này thành một câu trả lời hay, bạn nên chỉ ra CÁCH thực hiện chứ không chỉ đặt tên cho tính năng và liên kết các tài liệu (mặc dù điều đó cũng rất quan trọng). Các câu trả lời khác bên dưới có ví dụ thích hợp.
rudolfbyker

171

Cách để liên kết đến một địa phương, gói trong phát triển là để add đầu tiên trong dự án chính của bạn là composer.jsonmột kho lưu trữ , như thế này:

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

Bạn cũng cần có một phiên bản được chỉ định trong gói phát triển của mình composer.jsonhoặc theo cách tôi làm là yêu cầu gói sử dụng @dev, như sau:

composer require "vendorname/packagename @dev"

Nó sẽ xuất ra:

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

Lệnh @devtrong lệnh request rất quan trọng, trình soạn nhạc sử dụng lệnh này để lấy mã nguồn và liên kết biểu tượng nó với gói mới của bạn.

Đó là một cờ ổn định được thêm vào ràng buộc phiên bản (xem liên kết gói ).

Những điều này cho phép bạn hạn chế hoặc mở rộng thêm tính ổn định của một gói ngoài phạm vi của cài đặt độ ổn định tối thiểu .

Các cờ ổn định tối thiểu là:

Tùy chọn có sẵn (theo thứ tự của sự ổn định) là dev, alpha, beta, RC, và stable.


8
Lưu ý rằng bạn không được phép bởi nhà soạn nhạc chỉ định một đường dẫn nằm trong cùng thư mục mà composer.json được đặt.
MaPePeR

Điểm thú vị, MaPePeR tôi không biết điều này. Tuy nhiên, tôi đoán tất cả các khuôn khổ web đã xử lý việc này bằng cách đặt tất cả các phần phụ thuộc vào một thư mục "nhà cung cấp"? Yii2 làm được điều này, ít nhất.
Dhiraj Gupta

3
composer require "vendorname/packagename @dev"dịch để "require":{ "vendorname/packagename": "@dev" }trong composer.json của ứng dụng của bạn nếu bạn muốn chạy soạn nhạc cài đặt
Sir_Faenor

2
Vui lòng thêm cái này: composer config repositories.local path / full / or / relative / path / to / development / package như một cách chính xác để thêm kho lưu trữ
basil

1
Có thể yêu cầu nhà soạn nhạc cài đặt nó vào thư mục nhà cung cấp cho sản phẩm thay vì tạo một liên kết tượng trưng không?
BenjaminH

7

Sau khi dành một thời gian, cuối cùng tôi đã hiểu ra giải pháp. Có lẽ nó sẽ hữu ích cho những người như tôi và sẽ giúp bạn tiết kiệm thời gian, vì vậy tôi quyết định rằng tôi phải chia sẻ nó ở đây.

Giả sử rằng bạn có cấu trúc thư mục sau (liên quan đến thư mục gốc dự án của bạn):

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

Trong ví dụ này, bạn có thể thấy rằng localthư mục dành cho các dự án lồng nhau của công ty bạn, ví dụ bar-project. Nhưng bạn có thể định cấu hình bất kỳ bố cục nào khác, nếu muốn.

Mỗi dự án phải có composer.jsontệp riêng của nó , ví dụ như root composer.jsonlocal/bar-project/composer.json. Sau đó, nội dung của chúng sẽ như sau:

(root 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"
    }
  ]
}

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

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

Ví dụ: nếu bạn muốn định vị từng dự án trong một thư mục anh chị em riêng biệt, như sau:

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

- sau đó bạn cần liên kết đến thư repositoriesmục tương ứng trong phần:

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

Sau đó, đừng quên composer update(hoặc thậm chí rm -rf vendor && composer update -vnhư các tài liệu đề xuất )! Dưới mui xe, nhà soạn nhạc sẽ tạo một vendor/your-company/bar-projectliên kết tượng trưng nhắm mục tiêu đến local/bar-project(hoặc ../bar-projecttương ứng).

Giả sử rằng của bạn public/index.phpchỉ là một front controller, ví dụ:

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

Sau đó, bạn config/composition-root.phpsẽ là:

<?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();

1
"rm -rf nhà cung cấp / công ty / gói" là rất quan trọng
Alex83690

@ Alex83690 chỉ nếu bạn đã chạy composer updatevới tương tự composer.jsonvà do đó bạn cần phải loại bỏ các liên kết tượng trưng trước được tạo ra bởi nhà soạn nhạc
whyer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.