【问题标题】:Auto pull bitbucket private repository changes after every composer update每次作曲家更新后自动拉取 bitbucket 私有存储库更改
【发布时间】:2015-06-19 20:16:07
【问题描述】:

我在使用 bitbucket 私有存储库时遇到了一些问题...所以我在项目根目录的 composer.json 中添加了类似的内容:

"require": {
         "php" : ">=5.4.0",
            ...,
         "author/my-package": "0.2"
},

"repositories": [
    {
        "type": "vcs",
        "url":  "ssh://hg@bitbucket.org/author/my-package"
    }
    ...
]

所以在composer.phar update 之后它会在vendor 中创建repo 目录...但是在私有存储库中的新提交和项目根目录中的composer.phar 更新后它不会拉最后一个变更集...在第一个存储库导入时

结论

在 composer.phar 调试之后,我了解到如果包版本没有更改,它不会更新(拉取)最后一个变更集。

我创建了一个脚本,它会在每次运行作曲家更新后更新我的每个存储库。信息在这里https://getcomposer.org/doc/articles/scripts.md

<?php

namespace ComposerScript;

use Composer\Repository\RepositoryManager;
use Composer\Script\Event;
use Composer\Repository\PackageRepository;
use Composer\Package\CompletePackage;
use Composer\Util\ProcessExecutor;

class EventListener
{
    /**
 * @var ProcessExecutor
 */
protected static $processExecutor;

protected static $command = 'hg pull -u';

public static function getProcessExecutor()
{
    if (self::$processExecutor == null) {
        self::$processExecutor = new ProcessExecutor();
    }

    return self::$processExecutor;
}

public static function postUpdateCmd(Event $event)
{
    $composer = $event->getComposer();
    /** @var RepositoryManager $repositoryManager */
    $repositoryManager = $composer->getRepositoryManager();
    $cwd               = getcwd();

    foreach ($repositoryManager->getRepositories() as $repository) {
        if ($repository instanceof PackageRepository) {
            foreach ($repository->getPackages() as $package) {
                /** @var CompletePackage $package */
                $vendorName     = explode('/', $package->getName())[0];
                $repositoryPath = $cwd . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . $package->getName();

                if ($package->getSourceType() == 'hg' && $vendorName == 'myvendor' && is_dir($repositoryPath)) {
                    echo PHP_EOL . "Trying to execute '".self::$command."' in '".$repositoryPath . "'" . PHP_EOL;
                    $exitCode = self::getProcessExecutor()->execute(self::$command, $output, $repositoryPath);
                    if ($exitCode !== 0) {
                        echo "Unable to execute '" . self::$command . "' command in '" . $repositoryPath . "' dir" .
                            PHP_EOL .
                            "Message: " .
                            PHP_EOL .
                            $output;
                    } else {
                        echo 'Success';
                    }
                }
            }

            echo PHP_EOL;
        }
        }
    }
}

并在 composer.json 中添加了几行

"autoload"    : {
    "psr-0": {
        "ComposerScript\\EventListener" : ""
    }
},
"scripts" : {
    "post-update-cmd" : [
        "ComposerScript\\EventListener::postUpdateCmd"
    ]
}

【问题讨论】:

    标签: mercurial zend-framework2 repository composer-php bitbucket


    【解决方案1】:

    你已经告诉 composer 安装你的包的 0.2 版本,所以它就是这样做的。如果您运行更新,这不会改变。如果您想改为跟踪分支,请将版本更改为dev-master

    "require": {
        "php": ">=5.4.0",
        ...,
        "author/my-package": "dev-master"
    },
    

    【讨论】:

    • 但我没有开发,没有主分支,标签等。
    • 默认情况下,它将是默认分支。所以也许你可以使用“default”而不是“dev-master”?
    • @Mathiasdm 但是默认和 0.2 有什么区别?我尝试在 composer.json 中创建主书签、标签、分支等、分支别名 - “dev-master”:“0.2-dev”......但没有任何帮助......也许这是私有存储库的功能。 ..
    • 您能否编辑您的问题以包含从项目根目录运行的git branch -agit tag -l 的输出。这将列出您拥有的所有分支和标签。
    • @tim-fountain 首先我使用 mercurial,第二个我尝试了很多......所以我想看看例子......
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 2014-08-11
    • 2014-11-19
    • 2016-10-20
    • 2013-09-26
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多