简介
如果你曾阅读过我的任何之前的博客文章,你会知道我只要有机会,都喜欢为开源项目做出贡献。
为了能够对任何包进行工作,我通常会有一个可以用来测试我做出的更改的“操场”Laravel项目。这个项目基本上是Laravel的新安装,为我设置了一些路由和控制器来测试我的贡献。
这意味着我需要在项目中不需要直接更新任何供应商文件(在我的项目的vendor
目录中)的情况下工作在包内部。为了做到这一点,我在项目的composer.json
文件中设置了一些选项,以便我可以在本地工作在包上。
这对于你来说是一个很好的方法,你可以用这种方法对包进行可能的特性或更改的实验,然后将其作为pull请求提出。
在这篇简短的指南中,我将向你展示如果你正在考虑工作在一个包上(无论是你正在构建的新包或你希望为其做出贡献的现有包),你如何在你的项目中自己这么做。
本地包开发
在我们开始之前,我将首先假设你已经有一个新的Laravel安装。你并不一定需要有一个,但这确实简化了事情,因为这样可以减少与其他包冲突的可能性。
本指南的目的是安装我自己的一个短链接包分支(ashallendesign/short-url
)作为一个本地包。如果您不确定什么是分支,可以查看GitHub上的这一页,它很好地描述了分支。
顺便说一句,如果您想了解更多关于如何在Laravel项目中使用短链接包,可以阅读我的先前文章 "如何在Laravel中创建短链接"。
我们首先想让Composer知道,我们可能有一些存储在本地的包,可以使用composer require
和composer 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,以下信息应该有助于通过创建三个新函数来自动化此过程: composerLocal
、composerVcs
和composerRemote
。
要开始,打开您的~/.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
}
这是定义我们三个新函数(composerLocal
、composerVcs
和composerRemote
)。
您可能需要重新打开终端,或者运行以下命令以使命令可供使用
source ~/.zshrc
现在我们已经添加了这些命令,我们可以快速添加和删除项目中的本地仓库。运行它们将处理我们之前手动添加到composer.json
文件中的repositories
字段的正确字段。
composerLocal
命令允许我们指定要使用本地的Composer依赖项。它接受2个参数
- 应该在
repositories
字段中使用的密钥。这可能像local
或包的名称(例如 -short-url
)。 - 存储字段的目录。如果传递了此选项,则路径将直接添加到
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
命令。此命令接受一个参数
- 应该在
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
命令需要两个参数
- 应该在
repositories
字段中使用的密钥。这通常将是包的名称(例如 -short-url
)。 - 存储库的密钥。如果这是一个私有仓库,您可能需要使用版本控制系统(如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
请记住,在运行完 composerLocal
、composerRemote
和 composerVcs
函数后,请记得运行 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 包的快速概述。
如果您喜欢阅读这篇文章,我很乐意听到您的意见。同样,如果您有任何可以提高将来文章的建议,我也很乐意听到。
如果您感兴趣,想要每次我发布新文章时都得到更新,请免费订阅我的通讯。
继续构建精彩的内容!🚀
driesvints, shroomok 喜欢了这篇文章