英文:
Why composer.json is required for artisan command in Laravel?
问题
I am creating a laravel package for production and removing the composer.json and composer. lock once the dependencies are installed. But when I ran any artisan command I get the below error
在创建 Laravel 生产环境的包并在安装依赖项后移除 composer.json 和 composer.lock 时,运行任何 artisan 命令时出现以下错误:
In Application.php line 1399:
在 Application.php 的第 1399 行:
file_get_contents(/var/www/project_dir/composer.json): Failed to open stream: No such file or directory
file_get_contents(/var/www/project_dir/composer.json):打开流失败:没有这样的文件或目录
I am excluding the composer.json from the production environment as the autoloading is done through vendor/autoload.php.
我在生产环境中排除了 composer.json,因为自动加载是通过 vendor/autoload.php 完成的。
I was doing the same thing previously as well but not sure the issue appeared suddenly when I am deploying the new release.
我之前也是在做同样的事情,但不确定问题是在部署新版本时突然出现的。
英文:
I am creating a laravel package for production and removing the composer.json and composer. lock once the dependencies are installed. But when I ran any artisan command I get the below error
In Application.php line 1399:
file_get_contents(/var/www/project_dir/composer.json): Failed to open stream
: No such file or directory
I am excluding the composer.json from the production environment as the autoloading is done through vendor/autoload.php.
I was doing the same thing previously as well but not sure the issue appeared suddenly when I am deploying the new release.
答案1
得分: 2
Laravel 的 Illuminate\Foundation\Application
类从你的 composer.json
文件中加载根应用程序命名空间。这并不是什么新鲜事,即使在 2015 年的 Laravel v6 版本中,我都能找到类似的代码。
如果你的代码在之前的 Laravel 版本中没有部署 composer.json
文件就能正常工作,但现在不行了,你应该检查一下你的应用程序发生了什么变化。
英文:
Laravel's class Illuminate\Foundation\Application
loads the root application namespace from your composer.json
. This is nothing new, I can find such code even in Laravel v6 from 2015.
If your code was working well in any prior version of Laravel without having a composer.json
deployed, but is no longer, you should check what has changed in your application
答案2
得分: 1
经过调查,我发现问题是由于在App\Console\Kernel
类的commands()
函数中调用的以下代码引起的:
$this->load(__DIR__.'/Commands');
基本上,我们使用php artisan make:command
注册了控制台命令,它创建了一个文件,放在commands目录下,这是没问题的。但是,vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php
中的load方法尝试获取应用程序命名空间,由于缺少composer.json文件而失败。
为了处理这个问题,我从App\Console\Kernel
类的commands()
函数中删除了$this->load(__DIR__.'/Commands');
这行代码,并在App\Console\Kernel
类内部的$commands
属性中手动注册了命令。
https://laravel.com/docs/8.x/artisan#registering-commands
英文:
After investigating the issue I have found that the issue is causing due to
$this->load(__DIR__.'/Commands');
code called in App\Console\Kernel
class in commands()
function.
Basically, we have registered the console commands using php artisan make:command
, and it created the file inside the commands directory which is fine. But the load method from vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php
try to get the application namespace that fails due to a missing composer.json file.
So, to handle this I have removed the $this->load(__DIR__.'/Commands');
line from commands()
function inside the App\Console\Kernel
class and registered the commands manually using $commands
property within App\Console\Kernel
class.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论