composer prefer-dist和prefer-source有什么区别?

65

看 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网站和Google上搜索了一下,但好像没有任何相关信息(所以我认为这对熟悉Composer的人来说是核心而显而易见的问题——对于新手问题表示抱歉)。
我假设--prefer-source是Composer会询问Packagist的存储库位置,然后检出/克隆/导出等项目本身的地方。
如果是这样的话,--prefer-dist从哪里下载?它下载什么?

完全猜测,“dist”是“distribution”的缩写。 - nickb
@nickb 这就是在线文档让我相信的内容,但似乎没有任何描述分布是什么的内容。 - Alana Storm
3
请参考Smarty的示例。看起来,“dist”是依赖项发布的稳定版本,而“source”可能是直接从其源代码控制中获取的最新快照。请注意,此处不提供解释或额外内容。 - nickb
请您考虑重新选择接受的答案,因为我的回答是正确的。 - Peyman Mohamadpour
3个回答

60
根据http://getcomposer.org/doc/03-cli.md--prefer-source选项会更倾向于创建一个"版本控制存储库"的包目录。这相当于您键入:
$ git clone ...
或者
$ svn checkout ...

--prefer-dist选项将优先创建一个非“版本控制仓库”,这相当于您输入:

$ git clone ... ; rm -fr dir/.git
或者。
$ svn export ...

另外,您可以在您的composer.json中为sourcedist定义单独的存储库。下面是一个示例:

同样,您可以在composer.json中为sourcedist分别定义不同的仓库。这里是一个例子:

{
    "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
当你遇到这些错误时,请执行 composer dump-autoload 命令。 - Shawn McCool
2
--prefer-dist并不等同于去掉.git目录的git checkout,但它足够接近。正如您所指出的,您可以单独定义软件包的源和分发URL;如果您没有这样做,它将导致一个git存档而不是git checkout。这意味着.gitattributesexport.ignore选项将被尊重 - 如果项目正确设置了它,通常会省略在生产环境中不必要(有时甚至是有风险的)的单元测试和类似文件。 - Tgr
此外,--prefer-dist 更快一些,且不需要安装 Git。 - Tgr
感谢您的回复,对我很有帮助。请注意:存储库的结构略有变化:https://getcomposer.org/doc/05-repositories.md#package-2。 - Roman Kliuchko
1
有没有可能删除带有错误的注释——这似乎与问题完全无关,我认为现在已经解决了——已经过去将近10年了。 - Sybille Peters

33

我不赞赏,甚至不认同所提供的答案,因为它没有回答问题。所以尽管它有点过时,我仍然发布这个答案,供将来参考。


基础知识:

通常情况下,Composer处理版本号(如1.2.7),但并非总是如此。您还可以将分支(如dev-master)作为依赖项。

  • 如果您想让Composer要求一个版本号,它只会在本地复制文件(存储在您的vendor目录中)。

  • 如果您想让Composer检出一个分支而不是一个版本号,则有可能(Composer的合理假设)您想要开发它(从而进行更改),因此Composer会在本地克隆存储库(同样存储在vendor目录中)。


那么怎么办?!

问题:

如果您想要要求一个版本号,但仍然希望能够在本地进行开发,该怎么办?

答案:

在您的composer requirecomposer update命令中使用--prefer-source

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

问题:

如果你想要要求一个最新的开发分支,但你只想获取新的东西,而不想参与其中的开发怎么办?

回答:

使用--prefer-dist和你的composer requirecomposer update命令:

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

1
小错误“--prefer-srouce”应该是“--prefer-source”。 - Craig London
如果你省略了那些标志,那么 'dist' 是默认值吗? - robsch
你不能使用 composer install 命令来指定单个包。如果你想在包级别上指定源代码或分发版本,请在 composer.json 文件中使用 preferred-install 选项。 - Jeremy Gallant
也许被采纳的答案已经更新了。那它怎么就不能回答问题呢? - Frank Robert Anderson
@FrankRobertAnderson 我认为你自己已经回答了自己的问题! - Peyman Mohamadpour
看起来建议编辑队列已满。也许如果你删除关于被接受答案有多糟糕的整个部分,像我这样的问题就不需要了。 - Frank Robert Anderson

9

Composer文档中清晰地说明:

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

而且,

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

Source:源用于开发。这通常来自源代码存储库(例如git)。您可以在下载软件包后修改时获取此内容。

因此,

软件包可以提供其中任何一个,甚至两者都可提供。取决于某些因素,例如用户提供的选项和软件包的稳定性,会优先选择其中一个。

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

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


我执行了 php composer.phar require phpmailer/phpmailer,从响应看似乎它尝试从 dist 下载但缺少 zip 命令。因此它尝试从源中下载成功了。我想知道这是否意味着它从 dist 下载时得到的是一个压缩文件,而从源中下载则不是? - user3425506

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