作曲家prefer-dist和prefer-source之间的区别?

时间:2013-04-25 01:47:56

标签: php composer-php

查看PHP Composer的install命令的帮助,我看到以下两个选项

$ composer help install
Options:
 --prefer-source            Forces installation from package sources when possible, including VCS information.
 --prefer-dist              Forces installation from package dist even for dev versions.

什么是“dist”装置?我在作曲家网站和谷歌周围徘徊,但似乎没有任何解决这个问题的事情(所以我认为这对于熟悉Composer的人来说是核心和显而易见的事情 - 为新手问题道歉)

我假设--prefer-source是Composer将要求Packagist获取存储库位置,然后checkout / clone / export / etc.项目本身。

如果是,那么--prefer-dist从哪里下载?它下载了什么?

3 个答案:

答案 0 :(得分:32)

根据http://getcomposer.org/doc/03-cli.md--prefer-source选项更愿意创建一个“版本控制存储库”的包目录。这相当于您键入:

$ git clone ...

$ svn checkout ...

--prefer-dist选项更愿意创建非“版本控制存储库”,这相当于您键入:

$ git clone ... ; rm -fr dir/.git

$ svn export ...

此外,您可以在source中为distcomposer.json定义单独的回购。这是一个例子:

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "joshuaclayton/blueprint-css",
                "version": "master",
                "source": {
                    "url": "git://github.com/joshuaclayton/blueprint-css.git",
                    "type": "git",
                    "reference": "master",
                }
            }
        },
        {
            "type": "package",
            "package": {
                "name": "fiftyone/mobi-lite-php",
                "version": "2013.03.06",
                "dist": {
                    "url": "http://iweb.dl.sourceforge.net/project/fiftyone/51Degrees.mobi-Lite-2013.03.06.php.zip",
                    "type": "zip"
                },
            }
        }
    ]
}

注意:无论出于何种原因,当我使用--prefer-dist时,我有时会遇到错误,例如

Fatal error: Cannot redeclare class Zend_Db_Adapter_Pdo_Abstract in ...

在我使用--prefer-source时不会出现。出于这个原因,我只使用--prefer-source,直到我弄清楚这个问题的原因。

答案 1 :(得分:8)

我不钦佩,甚至不赞成提供的答案,因为没有解决问题。所以尽管它有点太老了,但我发布这个答案是为了进一步提及这个问题。

基础:

通常作曲家会处理标签(例如1.2.7),但事实并非如此。您可能还需要分支(如dev-master)作为依赖项。

  • 如果您希望作曲家需要标记,则只需复制本地文件(vendor目录中的某个位置)。

  • 如果你想让作曲家签出一个分支而不是一个标签,那么就有机会(作曲家的理性假设),你想要开发它(从而做出改变),所以作曲家克隆本地存储库(再次,vendor目录中的某个位置。)

那么,什么?!

问题:

如果您想要标记,但仍然可以在本地开发,该怎么办?

答案:

使用--prefer-source以及composer installcomposer updatecomposer require命令:

composer install symfony/symfony:3.4.* --prefer-source

问题:

如果您想要一个最新的开发分支怎么办,但您只是想获得新的东西并且不想参与其开发?

答案:

使用--prefer-dist以及composer installcomposer updatecomposer require命令:

composer install symfony/symfony:dev-master --prefer-dist

答案 2 :(得分:2)

正如Composer's Documentation中明确指出的那样:

  

事实上,内部Composer将每个版本视为单独的包。虽然在使用Composer时这种区别并不重要,但是当您想要更改它时,这一点非常重要。

  

Dist :dist是包数据的打包版本。通常是已发布的版本,通常是稳定版本

     

来源:来源用于开发。这将通常来自源代码存储库,例如git 。当您想要修改下载的包时,可以获取此内容。

所以,

  

包可以提供其中任何一个,甚至两者。根据某些因素,例如用户提供的选项和包装的稳定性,将优先考虑。

如果您正在检查分支机构,则假定您要在分支机构上工作,并且Composer实际上将repo克隆到供应商目录中的正确位置。

对于标签,它只是复制正确的文件而不实际克隆存储库。