Làm thế nào để yêu cầu chính xác một cam kết cụ thể trong Composer để nó có sẵn cho các gói phụ thuộc?


108

Tôi có một thư viện foo/foo-librequiresmột cam kết cụ thể từ GitHub:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

và nó hoạt động tốt:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

nhưng khi tôi yêu cầu thư viện đó trong dự án khác:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

nó tạo ra lỗi phụ thuộc:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

Vì vậy, câu hỏi của tôi là: làm thế nào để xác định chính xác requirecam kết cụ thể từ GitHub trong thư viện của tôi, để nó có sẵn trong các gói phụ thuộc?


3
Lưu ý rằng khi yêu cầu cam kết, nhà soạn nhạc sẽ không tuân theo các yêu cầu cam kết đó (cmoposer.json). Thay vào đó, nó tính toán yêu cầu đầu nhánh sẽ thay đổi theo thời gian. Vì vậy, điều này có thể hoạt động trong một thời gian, nhưng chắc chắn sẽ bị hỏng trong tương lai.
estani

Câu trả lời:


157

Bạn sẽ phải yêu cầu rõ ràng thư viện Gaufrette tại mã băm đó, có devgắn cờ, trong cả thư viện và ứng dụng của bạn. Một cái gì đó như thế này sẽ hoạt động trong ứng dụng composer.json:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

Từ tài liệu :

Nếu một trong các gói phụ thuộc của bạn có phụ thuộc vào một gói không ổn định, bạn cũng cần yêu cầu rõ ràng gói đó, cùng với cờ ổn định đủ của nó.

Tài liệu cũng gợi ý rằng bạn sẽ cần bao gồm kho lưu trữ cho Gaufrette trong bar/bar-apptệp Composer của mình , mặc dù có vẻ như điều này không cần thiết trong trường hợp này. Tôi cung không chăc tại sao.


Tôi đã thử điều này, cũng không hoạt động. Tôi nghĩ nó có thể liên quan đến việc Composer thích Packagist hơn GitHub?
Maciej Sz

Không, tôi đã kiểm tra với kho lưu trữ cục bộ của mình - đó không phải là vấn đề cụ thể của GitHub.
Maciej Sz

Tôi khá chắc chắn rằng tôi đã làm việc này trước đây. Điều gì sẽ xảy ra nếu bạn thêm "minimum-stability": "dev"vào các bar/bar-appyêu cầu?
Chris

3
vẻ như bạn sẽ phải yêu cầu rõ ràng Gaufrette tại hàm băm đó trong cả thư viện và ứng dụng của bạn. "Nếu một trong các gói phụ thuộc của bạn có sự phụ thuộc vào một gói không ổn định, bạn cũng cần yêu cầu rõ ràng gói đó, cùng với cờ ổn định đủ của nó." Lưu ý rằng bạn có thể có một số gói, ví dụ như Gaufrette, ở mức devổn định và mặc định stablecho mọi thứ khác.
Chris

2
Có vẻ như GitHub được hỗ trợ bởi Composer - Tôi vừa xóa "url": "https://github.com/KnpLabs/Gaufrette.git"gói từ đầu tiên và nó vẫn hoạt động.
Maciej Sz

15

Đây là cách bạn thực hiện trên dòng lệnh:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

Bạn không cần phải sử dụng toàn bộ hàm băm, một hàm băm dài bảy ký tự dường như là một mẹo nhỏ. Như đã đề cập ở trên, dự án của bạn sẽ cần hỗ trợ dev - điều mà nó sẽ phàn nàn nếu chưa được thiết lập. Ngoài ra, sử dụng --with-dependenciesđể nhận bất kỳ phụ thuộc nào của cái bạn đang cập nhật.


0

Nếu bạn đang thực hiện các thay đổi cho Kho lưu trữ Git bằng cách fork, hãy đảm bảo rằng bạn sử dụng Tên gói thực sự được xác định trong tệp composer.json của chính gói - vì vậy, mặc dù tôi đã tách gói vào tài khoản github joshuapaling của riêng mình và gói hiện đang ở tại URL https://github.com/joshuapaling/Cake-Resque.git , điều này hoàn toàn không ảnh hưởng đến tên của gói, từ quan điểm của nhà soạn nhạc.

Một lỗi ngu ngốc - nhưng tôi là người mới sáng tác và lúc đầu không rõ lắm! Vì vậy, tôi hy vọng điều này sẽ giúp ai đó khác có cùng vấn đề.

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.