如何指定Composer的安装路径?

104

我有这个定义:

{
    "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.*"
    }
}

我正在使用Symfony 1,并且我想将它们安装在plugins/sfGuardPlugin/上。我该如何指定?

3个回答

160

看起来你可以定义vendor目录为其他的名称(在你的情况下是plugins):

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

然后,您可以将包名称重命名为不包含级别目录的名称,例如:

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

因此,您的composer.json应该如下所示:

{
    "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.*"
    }
}

编辑

使用此配置,您将获得路径(这显然不适用于symfony):

plugins/sfGuardPlugin/sfGuardPlugin-4.0.2/

我通过这个 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.*"
    }
}

很好,我是否可以以某种方式使提取的文件夹不像现在一样深入到 plugins/sfGuardPlugin/sfGuardPlugin-4.0.2/,而是想要 plugins/sfGuardPlugin - Tower
是的,刚刚看到了。我正在尝试使用不同的类型(而不是tar)。 - j0k
那很好,所以他们仍然有一个代码库 :) - Tower
是的 :) 我认为它在遥远的未来也不会被删除。 - j0k
3
有没有一种方法只为特定的软件包指定供应商目录,而将其他软件包保留为默认设置? - mr1031011
1
这是一个很好且经过研究的答案,但不要失去Adam's V.,因为它似乎更正式,而且更容易;-) - mTorres

28

你还可以使用composer/installers,这是一个具有“symfony1-plugin”包类型的多框架composer库安装程序。以下是我的composer.json文件,以便它在lib/vendor中安装Symfony 1.4(及其插件在/plugins中):

{
    "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"
    }
}

我不明白这怎么会指向 /plugins - 你能详细说明一下吗? - Isaac Lubow
@IsaacLubow,这将由composer-installers包完成,因为symfony1在那里有一个插件 :) 请查看Symfony1Installer.php - spirit

15

参见COMPOSER_VENDOR_DIR环境变量。

通过设置此变量,您可以让Composer将依赖项安装到除了vendor之外的目录中。

如果您希望在特定环境(如vagrant或docker)中覆盖此设置,则可以设置该变量,这将非常有用。在这些情况下,您不希望它在共享文件夹/卷中。

正如J0k所说,composer.jsonconfig部分中有vendor-dir

默认为vendor。 如果需要,您可以将依赖项安装到其他目录中。 在vendor-dir和以下所有*-dir选项中,$HOME和~将被替换为您的主目录路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接