Làm thế nào để chỉ định đường dẫn cài đặt Composer?


93

Tôi có định nghĩa này:

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "symfony/sfGuardPlugin",
                "version": "4.0.2",
                "dist": {
                    "url": "http://plugins.symfony-project.org/get/sfGuardPlugin/sfGuardPlugin-4.0.2.tgz",
                    "type": "tar"
                }
            }
        }
    ],
    "require": {
        "symfony/sfGuardPlugin": "4.0.*"
    }
}

Tôi đang sử dụng Symfony 1 và tôi muốn cài đặt chúng trên plugins/sfGuardPlugin/. Làm cách nào để xác định điều này?

Câu trả lời:


140

Có vẻ như bạn có thể định nghĩa vendordir là một cái gì đó khác ( pluginstrong trường hợp của bạn):

{
    "config": {
        "vendor-dir": "plugins"
    }
}

Sau đó, bạn có thể đổi tên gói để không có dir cấp bên trong, như:

        "package": {
            "name": "sfGuardPlugin",

Vì vậy, của bạn composer.jsonsẽ trông như thế này:

{
    "config": {
        "vendor-dir": "plugins"
    },
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "sfGuardPlugin",
                "version": "4.0.2",
                "dist": {
                    "url": "http://plugins.symfony-project.org/get/sfGuardPlugin/sfGuardPlugin-4.0.2.tgz",
                    "type": "tar"
                }
            }
        }
    ],
    "require": {
        "sfGuardPlugin": "4.0.*"
    }
}

Biên tập

Sử dụng cấu hình này, bạn sẽ nhận được đường dẫn ( tất nhiên là không tốt cho symfony):

plugin / sfGuardPlugin / sfGuardPlugin-4.0.2 /

Tôi đã tìm thấy một giải pháp cho điều này composer.json:

{
    "config": {
        "vendor-dir": "plugins"
    },
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "sfGuardPlugin",
                "version": "4.0.2",
                "source": {
                    "url": "http://svn.symfony-project.com/plugins/sfGuardPlugin/",
                    "type": "svn",
                    "reference": "branches/1.3/"
                }
            }
        }
    ],
    "require": {
        "sfGuardPlugin": "4.0.*"
    }
}

Tốt, tôi cũng có thể làm cho nó bằng cách nào đó để thư mục giải nén không đi sâu như bây giờ plugins/sfGuardPlugin/sfGuardPlugin-4.0.2/:, thay vào đó tôi muốn plugins/sfGuardPlugin?
Tháp

Vâng, chỉ cần thấy điều đó. Tôi đang thử với một loại khác (thay vì tar).
j0k

Điều đó hoạt động tốt - vì vậy sau tất cả, họ vẫn có một kho lưu trữ :)
Tower

3
có cách nào để chỉ định dir của nhà cung cấp chỉ cho một số gói cụ thể và để các gói khác làm mặc định không?
mr1031011

1
Đây là một câu trả lời tuyệt vời và nghiên cứu, nhưng không mất V. Adam, vì nó có vẻ chính thức hơn, oh và dễ dàng ;-)
mTorres

28

Bạn cũng có thể sử dụng composer / installers , một trình cài đặt thư viện composer đa khuôn khổ với kiểu gói "symfony1-plugin". Đây là tệp composer.json của tôi trông giống như vậy, để nó có thể cài đặt cả Symfony 1.4 (trong lib / nhà cung cấp) và các plugin trong (/ plugin):

{
    "config": {
        "vendor-dir": "lib/vendor"
    },
    "repositories": {
        "symfony": {
            "type": "package",
            "package": {
                "name": "symfony/symfony1",
                "version": "1.4",
                "dist": {
                    "url": "https://github.com/symfony/symfony1/zipball/1.4",
                    "type": "zip"
                }
            }
        },
        "sfResquePlugin" : {
            "type": "package",
            "package": {
                "name": "devpips/sfResquePlugin",
                "type": "symfony1-plugin",
                "version": "0.1",
                "dist": {
                    "url": "https://github.com/devpips/sfResquePlugin/zipball/master",
                    "type": "zip"
                }
            }
        }
    },
    "require": {
        "composer/installers": "dev-master",
        "symfony/symfony1": "1.4",
        "devpips/sfResquePlugin":"0.1"
    }
}

Tôi không hiểu làm thế nào điều này sẽ chỉ ra bất cứ điều gì /plugins- bạn có thể giải thích?
Isaac Lubow

@IsaacLubow, điều này sẽ được thực hiện theo composer-installersgói, vì symfony1có một plugin ở đó :) Kiểm tra Symfony1Installer.php
linh

11

Xem COMPOSER_VENDOR_DIRbiến môi trường.

Bằng cách thiết lập var này, bạn có thể làm cho Composer cài đặt các phần phụ thuộc vào một thư mục khác với nhà cung cấp.

Có thể hữu ích trong trường hợp bạn muốn ghi đè điều này trong một môi trường cụ thể chẳng hạn như vagrant hoặc docker nơi bạn không muốn điều này nằm trong một thư mục / ổ đĩa được chia sẻ.

Và như J0k nói rằng, có vendor-dirtrong configđoạncomposer.json

Mặc định cho nhà cung cấp. Bạn có thể cài đặt các phần phụ thuộc vào một thư mục khác nếu muốn. $ HOME và ~ sẽ được thay thế bằng đường dẫn thư mục chính của bạn trong nhà cung cấp-dir và tất cả các tùy chọn * -dir bên dưới.

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.