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

Ala*_*orm 41 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.
Run Code Online (Sandbox Code Playgroud)

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

我假设--prefer-sourceComposer会向Packagist询问存储库位置,然后checkout/clone/export/etc. 项目本身.

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

Ros*_* II 37

根据http://getcomposer.org/doc/03-cli.md,该--prefer-source选项将更喜欢创建一个"版本控制存储库"的包目录.这相当于你键入:

$ git clone ...
Run Code Online (Sandbox Code Playgroud)

要么

$ svn checkout ...
Run Code Online (Sandbox Code Playgroud)

--prefer-dist选项将更喜欢创建非"版本控制存储库",这相当于您键入:

$ git clone ... ; rm -fr dir/.git
Run Code Online (Sandbox Code Playgroud)

要么

$ svn export ...
Run Code Online (Sandbox Code Playgroud)

此外,您可以为您sourcedist您的定义单独的回购composer.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"
                },
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

注意:无论出于何种原因,当我使用时--prefer-dist,我有时会收到诸如此类的错误

Fatal error: Cannot redeclare class Zend_Db_Adapter_Pdo_Abstract in ...
Run Code Online (Sandbox Code Playgroud)

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

  • `--prefer-dist` 并不等同于 git checkout 减去 `.git` 目录,尽管它已经足够接近了。正如您所指出的,您可以单独定义包的源 URL 和分发 URL;如果不这样做,将会生成 git 存档而不是 git checkout。这意味着 `.gitattributes` 的 [`export.ignore`](https://git-scm.com/docs/gitattributes#_export_ignore) 选项将受到尊重 - 如果项目愿意正确设置它,单元测试和类似的生产站点中不必要(有时甚至有风险)的文件通常会被省略。 (3认同)

wuj*_*ujt 10

正如Composer 文档中明确指出的:

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

和,

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

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

所以,

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

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

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


Pmp*_*mpr 10

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


基本:

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

  • 如果您希望composer需要标记,它只会复制本地文件(vendor目录中的某个位置).

  • 如果你想让作曲家签出一个分支而不是一个标签,那么就有机会(作曲家的理性假设),你想要开发它(从而进行更改),因此作曲家克隆你本地的存储库(再次,在vendor目录中的某个地方).


所以呢?!

题:

如果您想要一个标签,但仍然可以在您的本地开发它,该怎么办?

回答:

使用--prefer-source连同你的composer install,composer updatecomposer require命令:

composer install symfony/symfony:3.4.* --prefer-source
Run Code Online (Sandbox Code Playgroud)

题:

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

回答:

使用--prefer-dist连同你的composer install,composer updatecomposer require命令:

composer install symfony/symfony:dev-master --prefer-dist
Run Code Online (Sandbox Code Playgroud)