2013-07-25 34 views
5

Tôi có composer.json này tập tinLàm cách nào để tải thư mục nhà cung cấp của riêng tôi với Composer?

{ 
    "require": { 
     "filp/whoops": "1.*" 
    } 
} 

Tuy nhiên, tôi có một thư mục cho dự án của riêng tôi gọi vendor/imaqtpie/framework/src. Điều này không được lưu trữ ở bất cứ đâu, vì vậy nếu tôi làm composer update để cập nhật các tệp tự động tải, nó sẽ gây ra lỗi.

The requested package "imaqtpie/framework" could not be found in any version, there may be a typo in package name. 

Tôi phải tự thêm tệp này để tự động tải tệp để hoạt động.

'Framework' => array($vendorDir . '/imaqtpie/framework/src') 

Có cách nào để giải quyết vấn đề này không?

Tôi muốn nói với Composer rằng thư mục nhà cung cấp địa phương này phải được tự động tải mỗi lần bất kể kiểm tra máy chủ/phiên bản hay tìm kiếm giải pháp thanh lịch hơn vì tôi là người mới soạn nhạc.

Trả lời

2

Bạn phải tạo kho lưu trữ git cục bộ của riêng mình với mã gói để đạt được điều đó. Sau đó, hãy đặt nội dung như thế này vào tệp composer.json của bạn.

"repositories": [ 
    { 
     "type":"vcs", 
     "url":"/path/to/your/source" 
    } 
], 

"require":{ 
    "filp/whoops":"dev-master" 
} 

tự động load không phải là một vấn đề nếu bạn thực hiện nó theo cách này ...

+0

Đây là câu trả lời đúng. Bạn không nên phiên bản kiểm soát thư mục 'vendor' của bạn, do đó tốt nhất là tạo repo cho mã bạn muốn thêm vào thư mục nhà cung cấp của bạn và thêm nó qua nhà soạn nhạc. –

0

Có một vài cách bạn có thể làm điều này.

1. Tôi muốn nói cách chính xác nhất, là lưu trữ và sử dụng Satis để tạo một 'nhà đóng gói' riêng tư. Sau đó, nhà soạn nhạc sẽ hành xử "bình thường" và nhận phiên bản mới nhất, thực hiện kiểm tra phiên bản, v.v. nhưng bạn nói bạn không quan tâm đến điều này.

Nếu bạn muốn biết thêm chi tiết tôi có thể mở rộng về điều này, tôi đã thiết lập nhiều gói satis và nó hoạt động thực sự tốt. (Lưu ý có còn là thương mại mới Toran Proxy mà tôi đã không trialled được nêu ra.)

2. Nếu thư viện 'imaqtpie' của bạn là một thư viện cung cấp giả (có vẻ như bạn chỉ có một số tập tin bạn đã lưu trữ ở đó , như bạn sẽ có một thư viện bao gồm kiểu cũ?), thì bạn có thể chỉ cần sử dụng một sơ đồ lớp để trỏ trình nạp tự động vào thư mục đó từ ứng dụng cấp cao nhất của bạn. Điều này chỉ có ý nghĩa nếu bạn đang bao gồm thư mục đó trong ứng dụng cấp cao nhất của mình.

Vì vậy json nhà soạn nhạc của ứng dụng của bạn có thể trông giống như:

{ 
    "require": { 
     "filp/whoops": "1.*" 
    }, 
    "autoload": { 
     "classmap":[ 
      "vendor/imaqtpie/framework/src" 
     ] 
    } 
} 

Vì vậy, đây nói với nhà soạn nhạc có một loạt các lớp trong thư mục đó. Khi bạn chạy composer dump-autoload, nó sẽ quét thư mục và tạo vendor/composer/autoload_classmap.php với tất cả các tệp của bạn được liệt kê.

Đây không phải là cách bạn phải sử dụng nhà soạn nhạc, nhưng bạn không yêu cầu sử dụng nhà soạn nhạc để quản lý gói mà bạn đang hỏi cách sử dụng trình tải tự động của nhà soạn nhạc, điều tôi đoán là tốt! miễn là bạn hiểu những rủi ro.

3. Nếu gói của bạn là một trong hai PSR0 hoặc 4 (nó có vẻ có khả năng từ thư mục "src") sau đó bạn muốn tương tự làm điều này trong ứng dụng top-level:

{ 
    "require": { 
     "filp/whoops": "1.*" 
    }, 
    "autoload": { 
     "psr-4":{ 
      "Imaqtpie\\Framework\\":"vendor/imaqtpie/framework/src" 
     ] 
    } 
} 

Mà lại là một chút lẻ, nhưng nên làm việc!

Thông thường, bạn muốn xác định con đường này trong composer.json gói của bạn và sau đó khi bạn làm một bản cập nhật nó được sáp nhập vào composer.lock của bạn và sau đó là vendor/composer/installed.json (đó là nguồn sử dụng cho các bãi-autoload). Nhưng về lý thuyết bạn có thể tải bất cứ thứ gì bạn muốn từ ứng dụng cấp cao nhất, và do đó bạn có thể 'mã cứng' một gói vào thư viện nhà cung cấp và đường dẫn lớp tới nó.

Tôi có thể khuyên bạn nên không làm việc này! Thư mục nhà cung cấp là một vị trí xa hoa mà hầu hết mọi người và các chương trình giả định đều có thể bị phá hủy và xây dựng lại theo ý thích. Vì vậy, nó là một nơi nguy hiểm để lưu trữ bất cứ điều gì mà không phải là trong một gói. Nó cũng gây nhầm lẫn cho bất kỳ nhà phát triển khác, những người sẽ giả định như vậy.

Vì vậy, tôi khuyên bạn nên chuyển thư viện của bạn đến một vị trí khác khỏi thư mục của nhà cung cấp, ví dụ: 'lib', và sau đó sử dụng cách tiếp cận classpath ở trên để bao gồm nó trong autoloader.

Các vấn đề liên quan