首页 > 解决方案 > Laravel - 在部署自定义 Artisan 命令时未部署 composer.json 文件

问题描述

我有一个 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文件不存在,但我不知道为什么它不存在。

我已经测试了使用和不使用命令的部署,并且它在没有命令的情况下工作正常 - 成功部署和失败部署之间的唯一区别是添加了一个自定义工匠命令。

如果有用,我的命令如下:

<?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

但是,我看不出这个脚本是如何导致问题的,因为它适用于没有这个新的工匠命令的部署。

标签: laravelnginxgitlabcomposer-phplaravel-artisan

解决方案


所以我设法解决了这个问题。该命令位于App\Console\Commands目录中 - 我将其重命名为App\Console\Custom_commands,并在 中App\Console\Kernel.php手动导入它,

protected $commands = [
    Maintenance::class
];

如果我将命令存储在另一个目录中,它也可以工作,即我在这里使用的命名是不相关的(只要它没有被调用Commands

老实说,我不知道为什么我必须这样做才能让它工作,所以我只是在回答这个问题,以防其他人有同样的问题。

干杯


推荐阅读