Sử dụng trình soạn thảo PHP để sao chép git repo


111

Tôi đang cố gắng sử dụng trình soạn nhạc để tự động sao chép kho lưu trữ git từ github không có trong packagist nhưng nó không hoạt động và tôi không thể biết mình đang làm gì sai.

Tôi nghĩ rằng tôi phải bao gồm nó trong số "kho" như vậy:

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

và sau đó có thể liệt kê nó trong phần "yêu cầu". Nó sẽ tương tự như ví dụ này nhưng nó không hoạt động. Nó chỉ đưa ra lỗi này:

Không thể giải quyết các yêu cầu của bạn đối với một bộ gói có thể cài đặt được.

Có ai đã cố gắng làm một cái gì đó như thế này chưa?

Câu trả lời:


110

Vào thời điểm viết năm 2013, đây là một cách để làm điều đó. Nhà soạn nhạc đã hỗ trợ thêm cho những cách tốt hơn: Xem câu trả lời của @igorw

BẠN CÓ BỆNH VIỆN KHÔNG?

Git, Mercurial và SVN được hỗ trợ bởi Composer.

BẠN ĐÃ VIẾT TRUY CẬP VÀO BỆNH VIỆN CHƯA?

Đúng?

BÁO CÁO CÓ composer.jsonTẬP TIN KHÔNG

Nếu bạn có kho lưu trữ, bạn có thể ghi vào: Thêm composer.jsontệp hoặc sửa tệp hiện có và KHÔNG sử dụng giải pháp bên dưới.

Đi tới câu trả lời của @igorw

CHỈ SỬ DỤNG CÁI NÀY NẾU BẠN KHÔNG CÓ BỆNH
VIỆN HOẶC NẾU BỆNH VIỆN KHÔNG CÓ composer.jsonVÀ BẠN KHÔNG THỂ THÊM

Điều này sẽ ghi đè mọi thứ mà Composer có thể đọc được từ kho lưu trữ ban đầu composer.json, bao gồm các phần phụ thuộc của gói và tự động tải.

Sử dụng packagekiểu sẽ chuyển gánh nặng xác định chính xác mọi thứ cho bạn. Cách dễ dàng hơn là có một composer.jsontệp trong kho và chỉ cần sử dụng nó.

Giải pháp này thực sự chỉ dành cho những trường hợp hiếm hoi mà bạn có tệp tải xuống ZIP bị bỏ rơi mà bạn không thể thay đổi hoặc một kho lưu trữ bạn chỉ có thể đọc nhưng nó không được duy trì nữa.

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}

7
Thay thế kho lưu trữ VCS bằng một kho lưu trữ gói là một ý tưởng tồi. Repo đích đã có a composer.json, vì vậy hãy sử dụng repo vcs. Ví dụ của bạn cũng ngắt tự động tải và bỏ qua branch-alias.
igorw 14/02/13

1
@igorw bạn có thể vui lòng liên kết đến thông tin đó để tôi và những người khác có thể hiểu được sự khác biệt không? Cảm ơn.
Mike Graf

5
Như đã giải thích trên trang kho lưu trữ một kho gói phải bao gồm tất cả thông tin. Nếu bạn không thêm autoloadtrường, nó sẽ không được đưa vào. Về cơ bản, bạn cần sao chép và dán tất cả thông tin từ composer.jsonđịnh nghĩa repo. VCS repo lấy thông tin đó trực tiếp từ VCS. Những lợi ích của branch-aliasđược giải thích trong tài liệu bí danhmột bài đăng trên blog mà tôi đã viết .
igorw

2
Tại sao điều này vẫn được ủng hộ? Tài liệu của nhà soạn nhạc thậm chí còn tuyên bố rõ ràng rằng nên tránh các repo gói. Làm ơn, ngừng khuyến khích các hành vi xấu.
igorw

1
Bạn khuyên tôi nên đổi nó thành gì?
Mike Graf

146

Gói đó trên thực tế có sẵn thông qua packagist . Bạn không cần định nghĩa kho lưu trữ tùy chỉnh trong trường hợp này. Chỉ cần đảm bảo bạn thêm require(luôn cần thiết) với ràng buộc phiên bản phù hợp.

Nói chung, nếu một gói có sẵn trên packagist, không thêm repo VCS. Nó sẽ chỉ làm mọi thứ chậm lại.


Đối với các gói không có sẵn qua packagist, hãy sử dụng kho lưu trữ VCS (hoặc git), như được hiển thị trong câu hỏi của bạn. Khi bạn làm như vậy, hãy đảm bảo rằng:

  • Trường "kho lưu trữ" được chỉ định trong root composer.json (đó là trường chỉ dành cho người gốc, các định nghĩa kho lưu trữ từ các gói bắt buộc bị bỏ qua)
  • Định nghĩa kho lưu trữ trỏ đến kho VCS hợp lệ
  • Nếu loại là "git" thay vì "vcs" (như trong câu hỏi của bạn), hãy đảm bảo rằng nó thực sự là git repo
  • Bạn có một requiregói được đề cập
  • Ràng buộc trong các requirephiên bản khớp với các phiên bản do VCS repo cung cấp. Bạn có thể sử dụng composer show <packagename>để tìm các phiên bản có sẵn. Trong trường hợp này ~2.3sẽ là một lựa chọn tốt.
  • Tên trong tên requirekhớp với tên trong điều khiển từ xa composer.json. Trong trường hợp này, nó là gedmo/doctrine-extensions.

Đây là một ví dụ composer.jsoncài đặt cùng một gói thông qua repo VCS:

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

Tài liệu repo của VCS giải thích tất cả những điều này khá tốt.


Nếu có kho lưu trữ git (hoặc VCS khác) composer.jsoncó sẵn, không sử dụng kho lưu trữ "gói". Gói đại diện yêu cầu bạn cung cấp tất cả siêu dữ liệu trong định nghĩa và sẽ hoàn toàn bỏ qua bất kỳ composer.jsonhiện diện nào trong bản phân phối và nguồn được cung cấp. Chúng cũng có những hạn chế bổ sung, chẳng hạn như không cho phép cập nhật thích hợp trong hầu hết các trường hợp.

Tránh repo gói ( xem thêm tài liệu ).


1
Ouu, cảm ơn! Tôi không tìm thấy nó vì tôi nghĩ nó sẽ được gọi sau git repo DoctrineExtensions.
martin

2
Luôn luôn nhìn vào tên được đưa vào composer.json.
igorw 19/10/12

16
-1 Tại sao điều này được đánh dấu là câu trả lời đúng? Nó chắc chắn đã giải quyết được vấn đề của OP nhưng Clarence và Mike Graf đã đưa ra câu trả lời cho vấn đề chung hơn đằng sau nó. Rất khó có khả năng bất kỳ ai đang tìm cách bao gồm các dự án không phải là packagist sẽ muốn đưa vào DoctrineExtensions.
aefxx 14/02/13

2
@aefxx câu trả lời của tôi làm trong thực tế cũng giải thích các vấn đề chung chung, mà là các requirelĩnh vực phải được xác định.
igorw 14/02/13

6
The VCS repo docs explain all of this quite well.... gì?
hek2mgl

47

Bạn có thể đưa kho lưu trữ git vào composer.json như sau:

"repositories": [
{
    "type": "package",
    "package": {
        "name": "example-package-name", //give package name to anything, must be unique
        "version": "1.0",
        "source": {
            "url": "https://github.com/example-package-name.git", //git url
            "type": "git",
            "reference": "master" //git branch-name
        }
    }
}],
"require" : {
  "example-package-name": "1.0"
}

1
Như đã giải thích trong các câu trả lời khác ở trên: Nếu bạn có kho lưu trữ, hãy thêm composer.jsontệp nếu có thể.
Sven

@Sven ... vì không thể chỉ định một cam kết cụ thể nào khác?
Cees Timmerman

Cảm ơn bạn đã chia sẻ, tôi đã lưu giờ :)
metamaker

Điều này được điều chỉnh để trở nên chung chung, nhưng về cơ bản, về cơ bản là một bản sao đơn giản của câu trả lời của Mike Graf, vì vậy tôi không chắc liệu nói chung có tốt hơn việc xem một thư viện cụ thể trong câu hỏi làm ví dụ hay không.
FantomX1

6

Chỉ cần yêu cầu nhà soạn nhạc sử dụng nguồn nếu có:

composer update --prefer-source

Hoặc là:

composer install --prefer-source

Sau đó, bạn sẽ nhận được các gói dưới dạng kho lưu trữ nhân bản thay vì tarball được trích xuất, vì vậy bạn có thể thực hiện một số thay đổi và cam kết chúng trở lại. Tất nhiên, giả sử bạn có quyền ghi / đẩy vào kho lưu trữ và Người soạn thảo biết về kho lưu trữ của dự án.

Tuyên bố từ chối trách nhiệm: Tôi nghĩ rằng tôi có thể trả lời câu hỏi hơi khác một chút, nhưng đây là những gì tôi đang tìm kiếm khi tôi tìm thấy câu hỏi này, vì vậy tôi hy vọng nó cũng sẽ hữu ích cho những người khác.

Nếu Composer không biết, kho lưu trữ của dự án ở đâu, hoặc dự án không có composer.json thích hợp, thì tình huống sẽ phức tạp hơn một chút, nhưng những người khác đã trả lời các tình huống như vậy.


3

Tôi đã gặp phải lỗi sau: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Nếu bạn đang yêu cầu một kho lưu trữ khác thực hiện các thay đổi của riêng mình, bạn sẽ có một kho lưu trữ mới.

Ví dụ:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

Url mới sẽ cần phải đi vào phần kho lưu trữ của bạn trong composer.json.

Hãy nhớ nếu bạn muốn tham chiếu đến fork của mình như my-foo/bartrong phần yêu cầu của bạn, bạn sẽ phải đổi tên gói trong composer.jsontệp bên trong repo mới của mình.

{
    "name":         "foo/bar",

=>

{
    "name":         "my-foo/bar",

Nếu bạn vừa chia sẻ, cách dễ nhất để làm điều này là chỉnh sửa nó ngay bên trong github.


Lưu ý rằng tên gói không phản ánh URL từ nơi bạn có thể đọc kho lưu trữ! Không có liên kết tự động giữa cả hai, cả hai đều có thể được chọn độc lập. Thông tin liên quan duy nhất về Composer là tên được ghi vào namethuộc tính bên trong composer.json.
Sven

2

Trong trường hợp của tôi, tôi sử dụng Symfony2.3.x và tham số độ ổn định tối thiểu theo mặc định là "ổn định" (tốt). Tôi muốn nhập một kho không có trong packagist nhưng gặp vấn đề tương tự "Không thể giải quyết các yêu cầu của bạn đối với một bộ gói có thể cài đặt được.". Có vẻ như composer.json trong repo mà tôi đã cố gắng nhập sử dụng "nhà phát triển" có độ ổn định tối thiểu.

Vì vậy, để giải quyết vấn đề này, đừng quên xác minh minimum-stability. Tôi đã giải quyết nó bằng cách yêu cầu một dev-masterphiên bản thay vì masternhư đã nêu trong bài đăng này .


4
Tôi đã có cùng một vấn đề, được thảo luận ở đây . Nếu bạn có một tham chiếu rõ ràng (như git commit), có vẻ như bạn có thể làm điều gì đó tương tự "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz

1

Nếu bạn muốn sử dụng một composer.jsontừ GitHub, bạn sẽ xem ví dụ này (trong phần VCS).

Phần gói dành cho các gói không có composer.json. Tuy nhiên, bạn đã không làm theo ví dụ đó hoặc nó cũng sẽ hoạt động. Hãy đọc những gì nó nói về kho lưu trữ gói:

Về cơ bản, bạn xác định cùng một thông tin có trong kho của nhà soạn nhạc packages.json, nhưng chỉ cho một gói duy nhất. Một lần nữa, các trường bắt buộc tối thiểu là tên, phiên bản và dist hoặc source.


0

Tôi cố gắng tham gia các giải pháp được đề cập ở đây vì có một số điểm quan trọng cần phải liệt kê.

  1. Như đã đề cập trong câu trả lời của @ igorw, URL đến kho lưu trữ phải nằm trong trường hợp đó được chỉ định trong tệp composer.json, tuy nhiên, vì trong cả hai trường hợp, composer.json phải tồn tại (không giống như cách thứ 2 @Mike Graf) xuất bản nó trên Packagist là không có nhiều khác biệt (hơn nữa Github hiện cũng cung cấp các gói dịch vụ dưới dạng gói npm), chỉ có sự khác biệt thay vì nhập URL theo nghĩa đen tại giao diện packagist sau khi được đăng ký.

  2. Hơn nữa, nó có một thiếu sót là nó không thể dựa vào thư viện bên ngoài sử dụng cách tiếp cận này vì các định nghĩa kho lưu trữ đệ quy không hoạt động trong Composer. Hơn nữa, do đó, dường như có một "lỗi" trên nó, vì định nghĩa đệ quy không thành công ở phần phụ thuộc, việc xác định lại các kho lưu trữ một cách rõ ràng trong thư mục gốc dường như là không đủ mà tất cả các phụ thuộc từ các gói sẽ phải được chỉ định.

Với tệp nhà soạn nhạc (đã trả lời ngày 18 tháng 10 '12 lúc 15:13 igorw)

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

Không có tệp nhà soạn nhạc (đã trả lời ngày 23 tháng 1 '13 lúc 17:28 Mike Graf)

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}
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.