2012-09-03 27 views
9

Tôi đang phát triển một gói - myvendor/mylib - mà tôi định phân phối bằng Composer, có thể thông qua Packagist. Gói này chứa - trong số những thứ khác - một kịch bản lệnh PHP bin/console.php mà tôi muốn cung cấp cho các dự án - giả sử myvendor/mymain - nhập gói mylib.Tập lệnh phụ thuộc cần đường dẫn đến Trình tự động nạp Composer

Tôi biết rằng tôi có thể chỉ định trong gói mylib một khung cảnh config trong composer.json với một loạt các thùng nhập khẩu:

{ 
    "name": "myvendor/mylib", 
    "config" : { 
     "bin" : ["bin/console.php"] 
    } 
} 

Khi dự án mymain không một nhà soạn nhạc cài đặt/cập nhật, sau đó mylib/bin/console.php đây là symlinked như mymain/bin/console.php Hơn nữa, tôi biết rằng dự án mymain có thể chỉ định - trong mình composer.json - nơi ông muốn thùng phụ thuộc được symlinked:

{ 
    "name": "myvendor/mymain", 
    "config": { 
     "bin-dir": "scripts" 
    } 
} 

Trong trường hợp này, tập lệnh bảng điều khiển sau đó được liên kết với nhau là scripts/console.php.

Tính năng này hoạt động tốt - và cũng tuyệt vời như tất cả đều thoát ra. ;-)

Tuy nhiên, tập lệnh bin/console.php chính nó cần phải bao gồm các Composer-generated vendor/autoloader.php. Khi phát triển mylib cách ly, tập lệnh bin/console.php biết vị trí của riêng mình so với vendor/autoloader.php, vì vậy, anh có thể bao gồm nó dễ dàng. Nhưng một khi nó được nhập khẩu như một sự phụ thuộc vào một dự án khác - myvendor/mymain, trong trường hợp này - thì chỉ có kịch bản mymain/vendor/autoloader.php. Về nguyên tắc, các kịch bản giao diện điều khiển không thể biết nơi ông cư trú tương đối so với kịch bản tự động tải.

Nhà soạn nhạc có cung cấp một số biến môi trường - có thể truy cập vào tập lệnh bảng điều khiển - cho phép tập lệnh xác định đúng tập lệnh vendor/autoloader.php không?

BTW: Tôi biết về Composer CLI environment variable, vì vậy tôi tưởng tượng tôi có thể yêu cầu dự án nhập - mymain - xác định (và xuất!) Var COMPOSER_VENDOR_DIR. Sau đó, kịch bản giao diện điều khiển của tôi có thể sử dụng nó để tìm nạp tự động của dự án. Nhưng điều đó dường như có khả năng có vấn đề ở chỗ:

  1. Chúng tôi muốn thiết lập để chỉ áp dụng cho dự án này, nhưng một var vỏ (và xuất khẩu) sẽ áp dụng đối với tất cả dự án truy cập từ đó phiên vỏ. Có vẻ tự phụ thuộc vào sự phụ thuộc nhỏ của tôi - myvendor/mylib - để áp đặt điều đó vào một dự án nhập khẩu.

  2. Về nguyên tắc, chính sự phụ thuộc - myvendor/mylib - sẽ có thể tìm thấy những gì anh ta cần. Có vẻ như không đúng khi đưa nhà cung cấp vào nhà nhập khẩu.

WDYT? Cảm ơn trước. Ý tưởng chào đón.

Trả lời

3

Một cách tiếp cận (tức bước ra khỏi cuộc thảo luận với @igorw trên IRC freenode #composer rằng tôi diễn giải và trên đó tôi hơi mở rộng) là để cho kịch bản bin console.php lặp lên hệ thống tập tin, bắt đầu từ __DIR__, tìm kiếm sự hiện diện của autoload.php.

+2

Bạn không cần phải lặp lại thực sự, bạn chỉ có thể xem hai thư mục kể từ đó sẽ khớp với // – Seldaek

+0

@Seldaek: Phải, cuối cùng tôi đã hiểu mẫu của bạn từ [jsonlint] (https: // github.com/Seldaek/jsonlint/blob/master/bin/jsonlint) và triển khai theo cách đó. Cảm ơn nhiều! –

+0

Dường như mọi người vẫn gặp sự cố với điều này (tôi!) Tìm thấy câu trả lời ở đây: http://stackoverflow.com/questions/35271282/how-can-i-provide-a-script-for-php-cli-via -composer-as-standalone-and-as-depen – VladFr

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