支持Laravel.io的持续开发 →

使用本地Composer依赖进行Laravel插件开发

6 Oct, 2022 10 min read

简介

如果你曾阅读过我的任何之前的博客文章,你会知道我只要有机会,都喜欢为开源项目做出贡献。

为了能够对任何包进行工作,我通常会有一个可以用来测试我做出的更改的“操场”Laravel项目。这个项目基本上是Laravel的新安装,为我设置了一些路由和控制器来测试我的贡献。

这意味着我需要在项目中不需要直接更新任何供应商文件(在我的项目的vendor目录中)的情况下工作在包内部。为了做到这一点,我在项目的composer.json文件中设置了一些选项,以便我可以在本地工作在包上。

这对于你来说是一个很好的方法,你可以用这种方法对包进行可能的特性或更改的实验,然后将其作为pull请求提出。

在这篇简短的指南中,我将向你展示如果你正在考虑工作在一个包上(无论是你正在构建的新包或你希望为其做出贡献的现有包),你如何在你的项目中自己这么做。

本地包开发

在我们开始之前,我将首先假设你已经有一个新的Laravel安装。你并不一定需要有一个,但这确实简化了事情,因为这样可以减少与其他包冲突的可能性。

本指南的目的是安装我自己的一个短链接包分支ashallendesign/short-url)作为一个本地包。如果您不确定什么是分支,可以查看GitHub上的这一页,它很好地描述了分支

顺便说一句,如果您想了解更多关于如何在Laravel项目中使用短链接包,可以阅读我的先前文章 "如何在Laravel中创建短链接"。

我们首先想让Composer知道,我们可能有一些存储在本地的包,可以使用composer requirecomposer update来运行。为此,我们可以将以下内容添加到项目的composer.json文件中

"repositories": {
    "local": {
        "type": "path",
        "url": "./packages/*",
        "options": {
            "symlink": true
        }
    }
}

在上面的块中,我们告知Composer,我们可能在项目的packages目录中有一些可用的包。现在,每当尝试安装新的依赖项时,Composer会先尝试从packages目录安装它们,如果它们存在于那里。否则,将按常规安装。

我选择将它们放在这个文件夹中,因为我喜欢将本地包直接放在项目本身中。然而,如果您愿意,也可以将它们放在项目之外。您只需要记得更新url字段,以便指向正确的目录。

在将此字段添加到composer.json之后,整个文件可能看起来像这样

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "php": "^8.0.2",
        "guzzlehttp/guzzle": "^7.2",
        "laravel/framework": "^9.11",
        "laravel/sanctum": "^2.14.1",
        "laravel/tinker": "^2.7"
    },
    "require-dev": {
        "fakerphp/faker": "^1.9.1",
        "laravel/sail": "^1.0.1",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^6.1",
        "phpunit/phpunit": "^9.5.10",
        "spatie/laravel-ignition": "^1.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-update-cmd": [
            "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "repositories": {
        "local": {
            "type": "path",
            "url": "./packages/*",
            "options": {
                "symlink": true
            }
        }
    }
}

现在我们已经配置了composer.json文件,我们可以考虑在本地上安装Laravel包,以便开始工作。

为此,您首先需要将您的包克隆到packages文件夹中。以我的情况为例,我将在项目的根目录中运行以下命令以下载ashallendesign/short-url

git clone https://github.com/ash-jc-allen/short-url.git packages/short-url

或者,我也可以使用GitHub CLI(如果您还没有使用过,我强烈建议您试试)运行以下命令

gh repo clone ash-jc-allen/short-url packages/short-url

注意:如果您正在为别人的包做贡献,那么您很可能需要下载包的分支,而不是实际的包。

运行上述任意一个命令后,您现在应该能在您的packages目录(或具体来说,是packages/short-url)中看到包了。

现在我们有了本地可用的包,我们可以像通常一样使用Composer来安装它。在我们的特定情况下,我们可以运行以下命令

composer require ashallendesign/short-url

这就完成了!包现在已安装,您可以在本地开始对其进行修改。

您可能还会注意到,如果查看您的vendor目录(或在这种情况下,是vendor/ashallendesign目录),您可以在那里看到您的包。尽管这实际上并不是包本身,而只是指向packages文件夹中包的符号链接。

使用命令行界面

您可能会频繁地在本地和远程版本的包之间进行切换。如果是这样,您可能不想手动更新您的composer.json文件,您可能希望自动化这个过程。

为了加快这个过程,您可以使用Zsh函数直接在您的命令行中使用。

请注意,这只是一个简单的Zsh函数,我为其编写了在MacOS上工作。我在编写这类脚本方面也有有限的经历,因此可能会有更简洁、更易于实现相同目的的方法。我们将会覆盖的命令也只是一个起点,可以根据您的需求进行扩展。

但是,如果您正在使用Zsh,以下信息应该有助于通过创建三个新函数来自动化此过程: composerLocalcomposerVcscomposerRemote

要开始,打开您的~/.zshrc文件,并将其添加到其中

function composerLocal() {
    URL="${2:-./packages/${1}}"

    composer config repositories."$1" '{"type": "path", "url": "'"${URL}"'", "options": {"symlink": true}}' --file composer.json
}

function composerRemote() {
    composer config repositories."$1" --unset
}

function composerVcs() {
    composer config repositories."$1" '{"type": "vcs", "url": "'"${2}"'"}' --file composer.json
}

这是定义我们三个新函数(composerLocalcomposerVcscomposerRemote)。

您可能需要重新打开终端,或者运行以下命令以使命令可供使用

source ~/.zshrc

现在我们已经添加了这些命令,我们可以快速添加和删除项目中的本地仓库。运行它们将处理我们之前手动添加到composer.json文件中的repositories字段的正确字段。

composerLocal命令允许我们指定要使用本地的Composer依赖项。它接受2个参数

  1. 应该在repositories字段中使用的密钥。这可能像local或包的名称(例如 - short-url)。
  2. 存储字段的目录。如果传递了此选项,则路径将直接添加到composer.json文件中。否则,它默认为./packages/{KEY-HERE}路径,其中{KEY-HERE}是您传递给命令的第一个参数。

例如,如果我们想要指定检测项目中packages目录中的任何Composer包(就像我们之前做的那样),我们可以运行以下命令

composerLocal local "./packages/*"

底层,这实际上是在为我们运行以下Composer命令

composer config repositories.local '{"type": "path", "url": "./packages/*", "options": {"symlink": true}}' --file composer.json

同样,如果这些包存储在项目外部(在~/www/packages目录中),我们可以运行以下命令

composerLocal local "~/www/package-dev/packages/*"

此命令也可以用来定义应安装的单独包,而不仅是一个通用的捕获。例如,如果我们只想安装ashallendesign/short-url并在我们的项目packages目录中有一个本地副本,我们可以运行以下命令

composerLocal short-url

这将更新我们的repositories字段,如下所示

"repositories": {
    "short-url": {
        "type": "path",
        "url": "./packages/short-url",
        "options": {
            "symlink": true
        }
    }
}

或者,如果我们想安装该包,但它在~/www/packages/short-url目录中,我们可以运行以下命令

composerLocal short-url "~/www/package-dev/packages/short-url"

这将更新我们的repositories字段,如下所示

"repositories": {
    "short-url": {
        "type": "path",
        "url":  "~/www/package-dev/packages/short-url",
        "options": {
            "symlink": true
        }
    }
}

如果我们想本地忽略这些包并使用通过Packagist提供的远程版本,我们可以运行以下composerRemote命令。此命令接受一个参数

  1. 应该在composer.json文件中的repositories字段中移除的密钥。

例如,如果我们想要停止使用ashallendesign/short-url的本地版本并开始使用远程版本,我们可以运行以下命令

composerRemote short-url

此命令将从composer.json文件中的repositories字段中删除具有short-url密钥的字段。

底层,这实际上是在为我们运行以下Composer命令

composer config repositories.short-url --unset

或者,如果您想切换到在版本控制系统(如GitHub)中定义的包的使用,可以使用composerVcs命令。如果您正在使用的包是您自己的分支或私有仓库,并且未在Packagist中列出,则此命令非常理想。

composerVcs命令需要两个参数

  1. 应该在repositories字段中使用的密钥。这通常将是包的名称(例如 - short-url)。
  2. 存储库的密钥。如果这是一个私有仓库,您可能需要使用版本控制系统(如GitHub)提供的SSH链接。

例如,如果我们假设我们在https://github.com/Sammyjo20/short-url的存储库中有一个自己的私有分支ashallendesign/short-url,我们可以运行以下命令

composerVcs short-url [email protected]:Sammyjo20/short-url.git

这将更新我们的repositories字段,如下所示

"repositories": {
    "short-url": {
        "type": "vcs",
        "url": "[email protected]:Sammyjo20/short-url.git"
    }
}

底层,这实际上是在为我们运行以下Composer命令

composer config repositories.short-url '{"type": "vcs", "url": "[email protected]:Sammyjo20/short-url.git"}' --file composer.json

请记住,在运行完 composerLocalcomposerRemotecomposerVcs 函数后,请记得运行 composer dump-autoload,然后重新包含您的包(例如,通过运行命令 composer require ashallendesign/short-url。)

例如,要将 ashallendesign/short-url 添加为本地依赖项,我们可以运行以下命令

composerLocal short-url && composer dump-autoload && composer require ashallendesign/short-url

然后,如果我们想使用该包的远程版本,我们可以运行

composerRemote short-url && composer dump-autoload && composer require ashallendesign/short-url

结论

希望这篇文章能为您提供如何使用和编辑 Laravel 项目中的本地 Composer 包的快速概述。

如果您喜欢阅读这篇文章,我很乐意听到您的意见。同样,如果您有任何可以提高将来文章的建议,我也很乐意听到。

如果您感兴趣,想要每次我发布新文章时都得到更新,请免费订阅我的通讯

继续构建精彩的内容!🚀

最后更新 1 年前。

driesvints, shroomok 喜欢了这篇文章

2
喜欢这篇文章吗? 让作者知道并为他们鼓掌!
ash-jc-allen (Ash Allen) 我是来自英国普雷斯顿的 Laravel 自由职业 Web 开发者。我维护 Ash Allen Design 博客,并参与了许多酷炫和有趣的项目 🚀

你可能还会喜欢以下文章

2024年3月11日

使用 Larastan 将您的 Laravel 应用从 0 问题解决到 9

在 Laravel 应用执行前就能找到错误,这要归功于...

阅读文章
2024年7月19日

无需 traits 标准化 API 响应

我发现,大多数用于 API 响应的库...

阅读文章
2024年7月17日

通过 Discord 通知在您的 Laravel 项目中收集反馈

如何在一个 Laravel 项目中创建反馈模块,并在收到消息时接收 Discord...

阅读文章

感谢这些 惊人的公司 对我们提供的支持

您的标志在这里?

Laravel.io

Laravel 解决方案、知识共享和社区建设的门户网站。

© 2024 Laravel.io - 版权所有。