【问题标题】:Difference between composer prefer-dist and prefer-source?composer prefer-dist 和 prefer-source 之间的区别?
【发布时间】:2013-04-18 18:40:18
【问题描述】:

查看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 从哪里下载?它下载什么?

【问题讨论】:

  • 完全猜到“dist”是“distribution”的缩写
  • @nickb 这就是在线文档让我相信的——但似乎没有什么能描述分布是什么。
  • 检查their example for Smarty。看起来“dist”将是依赖项正在发布的稳定发行版,其中“source”将是最新的快照,可能直接来自其源代码控制。
  • 请重新考虑更改已接受的答案,作为我的正确答案。

标签: php composer-php


【解决方案1】:

我不欣赏,甚至不赞成提供的答案,因为它没有解决问题。因此,尽管它有点太旧了,但我还是发布了这个答案,以供进一步参考这个问题。


基础知识:

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

  • 如果您希望 composer 需要一个标签,它只会将文件复制到您的本地(在您的 vendor 目录中的某个位置)。

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


那么,什么?!

问题:

如果您需要一个标签,但仍能在本地开发它怎么办?

答案:

--prefer-sourcecomposer requirecomposer update 命令一起使用:

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

问题:

如果您想要一个最新的开发分支,但您只是想获得新的东西而不想参与它的开发?

答案:

--prefer-dist 与您的composer requirecomposer update 命令一起使用:

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

【讨论】:

  • 小错字--prefer-srouce应该是--prefer-source
  • 如果你省略这些标志,'dist' 是默认的?
  • 您不能使用composer install 指定单个包。如果您想在包级别指定 source vs dist,请在 composer.json 中使用 preferred-install
【解决方案2】:

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

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

和,

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

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

所以,

软件包可以提供其中任何一个,甚至两者都提供。根据某些因素,例如用户提供的选项和软件包的稳定性,将首选一个。

如果您要签出一个分支,则假定您要在该分支上工作,而 Composer 实际上会将存储库克隆到您的供应商目录中的正确位置。

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

【讨论】:

    【解决方案3】:

    根据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 定义单独的存储库。这是一个例子:

    {
        "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,直到我找出这个问题的原因。

    【讨论】:

    • 当您遇到这些错误时,请执行composer dump-autoload
    • --prefer-dist 不等同于 git checkout 减去 .git 目录,尽管它足够接近。如您所述,您可以分别定义包的源和分发 URL;如果你不这样做,它将导致一个 git 存档而不是一个 git checkout。这意味着.gitattributesexport.ignore 选项将被尊重 - 如果项目费心正确设置它,通常会省略生产站点中不必要(有时甚至有风险)的单元测试和类似文件。跨度>
    • 另外,--prefer-dist 有点快,不需要安装 Git。
    • 感谢您的回复,帮助很大。注意:存储库结构略有变化:getcomposer.org/doc/05-repositories.md#package-2.
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2019-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多