强制composer到符号链接本地包

Paw*_*zuk 7 composer-php

我正试图找到一种强制作曲家使用符号链接本地包的正确方法.

我知道有一个问题如何强制Composer下载本地包?但它没有回答我的问题.我需要确保它按预期工作,因为我将在CI工作流程中使用它.

有项目的composer.json像:

{
    "name": "Some project",
    "type": "project",
    "minimum-stability": "dev",
    "prefer-stable": true,
    "repositories": [{
        "type": "path", 
        "url": "packages/*/*"
    }]
}
Run Code Online (Sandbox Code Playgroud)

和package的composer.json(packages/sample/package):

{
    "name": "Sample package",
    "version": "1.0.0"
}
Run Code Online (Sandbox Code Playgroud)

我们假设:

  • sample/package:1.0.0发表在packagist(提交aaaaaa) - 未经修改composer.json
  • sample/package 本地在提交时签出 bbbbbb
  • 我不能versionsample/package本地修改

命令1:

$ composer require sample/package
Run Code Online (Sandbox Code Playgroud)

包从packagist(版本1.0.0,提交aaaaaa)获取.

命令2:

$ composer require sample/package:@dev
Run Code Online (Sandbox Code Playgroud)

包从本地版本到供应商目录(版本1.0.0,提交bbbbbb,符号链接)符号链接.

问题是:

  1. 尽管选项,为什么Command 1从packagist下载包minimum-stability?版本约束@dev允许您强制执行不同的稳定性,但它已经归结为dev项目配置.
  2. 在每种情况下,Command 2都会为本地包创建符号链接吗?
  3. 是否有比Command 2更好的方法来确保本地包被符号链接?

小智 12

尽管最小稳定性选项,为什么Command 1从packagist下载包?版本约束@dev允许您强制执行不同的稳定性,但它已经通过项目配置降低到dev.

我最好的猜测是,当没有提供版本约束时composer require sample/package,Composer仍会尝试找到一个稳定版本来安装,因为"prefer-stable": true.当您将此选项设置为false(或@dev明确提供包的版本约束)时,您应该看到Composer使用最新的可用版本(dev-master在提交时bbbbbb).

在每种情况下,Command 2都会为本地包创建符号链接吗?

并非在所有情况下.您可以强制Composer使用"symlink": true选项始终对包进行符号链接.

来自https://getcomposer.org/doc/05-repositories.md#path:

如果可能,本地包将被符号链接,在这种情况下,控制台中的输出将从中读取符号链接../../packages/my-package.如果无法进行符号链接,则将复制包.在这种情况下,控制台将输出Mirrored ../../packages/my-package.

您可以强制使用符号链接"symlink": true或使用"symlink": false选项镜像,而不是默认回退策略.从单个存储库部署或生成包时,强制镜像非常有用.

是否有比Command 2更好的方法来确保本地包被符号链接?

您应该避免掉线"prefer-stable": true,composer.json因为这会影响所有依赖项.

我建议您确保明确要求@dev版本为本地存储库sample/package"symlink": true为其设置.这将导致类似于:

{
    "name": "Some project",
    "type": "project",
    "minimum-stability": "dev",
    "prefer-stable": true,
    "repositories": [{
        "type": "path", 
        "url": "packages/*/*",
        "symlink": true
    }],
    "require": {
        "sample/package": "@dev"
    }

}
Run Code Online (Sandbox Code Playgroud)


Aer*_*dir 5

如果@Maciek Lewkowicz 提供的非常有用的信息不起作用,那么您可能处于这种情况:

  1. 您正在使用特定的分支(例如,dev-master);
  2. 您使用的分支来自您的远程存储库;
  3. 您正在尝试符号链接同一个分支,但这次使用路径(因此,您更改的唯一内容composer.json是包的源repositories,在composer.json文件的键中设置 repo )。

在这种情况下,一个简单的方法是composer update行不通的:Composer 不会拦截更改:因为 Composer 与您将存储库从远程更改为本地路径无关。它只检查分支是否相同,因此根本不更新。

因此,在这种情况下,什么都不起作用:它无法使用,symlink: force也无法更改有关源的首选项等等。

唯一可行的方法是更改​​分支。

因此,例如,您composer.json将是这样的:

{
    ...
    "require": {
        ...
-       "your/package": "dev-master",
+       "your/package": "dev-dev",
        ...
    },
    ...
    "repositories": [
        {
            "type": "path",
            "url": "/Path/To/Your/Local/package"
        }
    ]
}

Run Code Online (Sandbox Code Playgroud)

dev-dev是一个名为 的新分支dev:将分支从 更改dev-masterdev-dev将强制 Composer 再次下载包,因为所需的分支dev-master不再存在。

在再次下载包时,Composer 还将检查新源现在是否为本地路径,因此它将符号链接该文件夹。


Mau*_*ice 5

这可能不起作用的另一个原因是,当您在 repository. Composer 将使用它首先在其中找到包的存储库定义。

在我们的例子中,我们使用自定义 Satis 存储库。在 satis 存储库之后定义本地包时,它永远不会符号链接并始终使用 Satis 版本。首先定义本地包时,它确实有效。

工作示例:

    "repositories": {
        "our/local-package": {
            "type": "path",
            "url": "../../some-local-package",
            "options": {
                "symlink": true
            }
        },
        "satis": {
            "type": "composer",
            "url": "http://our.satis.url/"
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后打电话 composer require our/local-package:@dev