Laravel - composer.json 在部署自定义 Artisan 命令时未部署文件
Laravel - composer.json file not being deployed when also deploying custom Artisan commands
我有一个 Laravel 应用程序,它使用 GitLab 管道部署在测试和实时服务器上。
我最近决定制作自己的 Artisan 命令,我现在想将其部署到测试服务器,但是我在这样做时注意到以下错误:
In Application.php line 1258:
file_get_contents(/data/app/my-app-name/composer.json): failed to open stream: No such file or directory
我已通过 SSH 连接到服务器,可以确认 composer.json
文件不存在,但我不知道为什么不存在。
我已经测试了使用和不使用命令的部署,没有使用它也能正常工作 - 成功部署和失败部署之间的唯一区别是添加了一个自定义 artisan 命令。
万一有用,我的命令如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Config;
use File;
class Maintenance extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'maintenance:toggle';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Toggles a custom maintenance mode on or off';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// Get current config file
$array = Config::get('maintenance');
// Toggle 'enabled' value
$array['enabled'] = !$array['enabled'];
// Get string representation of array
$data = var_export($array, 1);
// Overwrite file - this causes change to persist, unlike Config::set()
if(File::put(config_path() . '/maintenance.php', "<?php\n return $data ;")) {
$this->info('Maintenance mode ' . (!$array['enabled'] ? 'enabled' : 'disabled') . '!');
// Clear and re-cache config
$this->callSilent('config:cache');
} else {
$this->error('Failed to modify config value');
}
}
}
此命令位于我的 app/Console/Commands
目录中,我没有更改我的 app\Console\Kernel.php
文件,因为 Laravel 文档指示 Commands
中的任何命令文件夹将由 Kernel.php
使用此行 $this->load(__DIR__.'/Commands');
自动导入
在此先感谢您的帮助,如果有任何其他有用的信息,请告诉我。
干杯
编辑:
该应用程序是使用以下 gitlab-ci.yml 脚本部署的:
- env | grep DOTENV | sed 's/DOTENV_//g' > .env
- |
rsync \
-a -z \
--include '.env' \
--include './public/angular' \
--exclude /.vscode/ \
--exclude ./angular/ \
--exclude database/ \
--exclude docs/ \
--exclude node_modules/ \
--exclude /scripts/ \
--exclude tests/ \
--exclude '/*.*' \
./ \
$SRV_SSH_USER@$SRV_IP_ADDRESS:$DEPLOY_DIR
- |
ssh $SRV_SSH_USER@$SRV_IP_ADDRESS <<EOF
rm -rf /tmp/$SRV_DEPLOY_DIR
mv /data/app/$SRV_DEPLOY_DIR /tmp
chmod 775 -R $DEPLOY_DIR
chown $SRV_SSH_USER:www-data -R $DEPLOY_DIR
mv $DEPLOY_DIR /data/app/$SRV_DEPLOY_DIR
php /data/app/$SRV_DEPLOY_DIR/artisan config:cache
php /data/app/$SRV_DEPLOY_DIR/artisan view:clear
php /data/app/$SRV_DEPLOY_DIR/artisan route:clear
php /data/app/$SRV_DEPLOY_DIR/artisan up
EOF
我不明白这个脚本是如何导致问题的,因为它适用于没有这个新的 artisan 命令的部署。
所以我设法解决了这个问题。该命令位于 App\Console\Commands
目录中 - 我将其重命名为 App\Console\Custom_commands
,在 App\Console\Kernel.php
中,我手动导入了它,
protected $commands = [
Maintenance::class
];
如果我将命令存储在另一个目录中,它也有效,即我在这里使用的命名是不相关的(只要它没有被调用 Commands
)
老实说,我不知道为什么我必须这样做才能让它工作,所以我只是回答这个问题,以防其他人遇到同样的问题。
干杯
我有一个 Laravel 应用程序,它使用 GitLab 管道部署在测试和实时服务器上。
我最近决定制作自己的 Artisan 命令,我现在想将其部署到测试服务器,但是我在这样做时注意到以下错误:
In Application.php line 1258:
file_get_contents(/data/app/my-app-name/composer.json): failed to open stream: No such file or directory
我已通过 SSH 连接到服务器,可以确认 composer.json
文件不存在,但我不知道为什么不存在。
我已经测试了使用和不使用命令的部署,没有使用它也能正常工作 - 成功部署和失败部署之间的唯一区别是添加了一个自定义 artisan 命令。
万一有用,我的命令如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Config;
use File;
class Maintenance extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'maintenance:toggle';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Toggles a custom maintenance mode on or off';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// Get current config file
$array = Config::get('maintenance');
// Toggle 'enabled' value
$array['enabled'] = !$array['enabled'];
// Get string representation of array
$data = var_export($array, 1);
// Overwrite file - this causes change to persist, unlike Config::set()
if(File::put(config_path() . '/maintenance.php', "<?php\n return $data ;")) {
$this->info('Maintenance mode ' . (!$array['enabled'] ? 'enabled' : 'disabled') . '!');
// Clear and re-cache config
$this->callSilent('config:cache');
} else {
$this->error('Failed to modify config value');
}
}
}
此命令位于我的 app/Console/Commands
目录中,我没有更改我的 app\Console\Kernel.php
文件,因为 Laravel 文档指示 Commands
中的任何命令文件夹将由 Kernel.php
使用此行 $this->load(__DIR__.'/Commands');
在此先感谢您的帮助,如果有任何其他有用的信息,请告诉我。
干杯
编辑:
该应用程序是使用以下 gitlab-ci.yml 脚本部署的:
- env | grep DOTENV | sed 's/DOTENV_//g' > .env
- |
rsync \
-a -z \
--include '.env' \
--include './public/angular' \
--exclude /.vscode/ \
--exclude ./angular/ \
--exclude database/ \
--exclude docs/ \
--exclude node_modules/ \
--exclude /scripts/ \
--exclude tests/ \
--exclude '/*.*' \
./ \
$SRV_SSH_USER@$SRV_IP_ADDRESS:$DEPLOY_DIR
- |
ssh $SRV_SSH_USER@$SRV_IP_ADDRESS <<EOF
rm -rf /tmp/$SRV_DEPLOY_DIR
mv /data/app/$SRV_DEPLOY_DIR /tmp
chmod 775 -R $DEPLOY_DIR
chown $SRV_SSH_USER:www-data -R $DEPLOY_DIR
mv $DEPLOY_DIR /data/app/$SRV_DEPLOY_DIR
php /data/app/$SRV_DEPLOY_DIR/artisan config:cache
php /data/app/$SRV_DEPLOY_DIR/artisan view:clear
php /data/app/$SRV_DEPLOY_DIR/artisan route:clear
php /data/app/$SRV_DEPLOY_DIR/artisan up
EOF
我不明白这个脚本是如何导致问题的,因为它适用于没有这个新的 artisan 命令的部署。
所以我设法解决了这个问题。该命令位于 App\Console\Commands
目录中 - 我将其重命名为 App\Console\Custom_commands
,在 App\Console\Kernel.php
中,我手动导入了它,
protected $commands = [
Maintenance::class
];
如果我将命令存储在另一个目录中,它也有效,即我在这里使用的命名是不相关的(只要它没有被调用 Commands
)
老实说,我不知道为什么我必须这样做才能让它工作,所以我只是回答这个问题,以防其他人遇到同样的问题。
干杯