質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.87%

Laravel5.5 Consoleで --env=*** を実行したい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 629

POSTMAN

score 67

composer.jsonやターミナル上で以下のようにして環境変数指定できますがバッチ内で環境変数指定する方法はないでしょうか?

php artisan ide-helper:generate --env=develop
class PostScriptsCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'post:cmd {argument : install or update}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'composer.json実行時にpost-update-cmdまたはpost-install-cmdで実行したい処理を実行する';


    private $environment;
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->environment = \App::environment();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        if (!isRequireDev()) {
            $this->error($this->environment . '環境では実行できません。');
            return;
        }
        switch ($this->argument('argument')) {
            case 'install':
                $this->install();
                break;
            case 'update':
                $this->update();
                break;
            default:
                $this->error('php artisan post:cmd -h でプログラム実行条件を確認してください。');
        }
    }

    /**
     * composer.jsonのpost-install-cmdディレクティブ内で実行したい処理を実行。
     */
    private function install()
    {
        $env = $this->argument('argument');
        $this->info('post-' . $env . '-cmdを実行します。');
    }

    /**
     * composer.jsonのpost-update-cmdディレクティブ内で実行したい処理を実行。
     */
    private function update()
    {
        $argument = $this->argument('argument');
        $this->info('post-' . $argument . '-cmdを実行します。');
        $this->call('ide-helper:generate');
//        $this->call('ide-helper:meta  --env=local'); // 認識されない、、、
//        $this->call('ide-helper:generate --env=' . $env);
//        $this->call('ide-helper:meta--env=' . $env);
    }
}

ide-helperはrequire-devに設定していて、本番環境では読み込まないようにしているので
composer installやupdate実行時に、--env=***で実行しないと以下のエラーがでてしまいます。

> php artisan ide-helper:generate
Exception: No application encryption key has been specified.
Skipping \Illuminate\Support\Facades\Crypt.
Exception: Database [user_server] not configured.
Skipping \Illuminate\Support\Facades\Schema.
Exception: No application encryption key has been specified.
Skipping \Illuminate\Support\Facades\Crypt.
Exception: Database [user_server] not configured.
Skipping \Illuminate\Support\Facades\Schema.

AppServiceProviderでenvがlocalとdevelopのみ、require-devを読み込むようにしています。

        /*
        |--------------------------------------------------------------------------
        | 開発環境と検証環境のみ必要パッケージ等を読み込む。composer.jsonのrequire-devに依存する。
        | require-devで導入するパッケージ等はconfig/xxx/app.phpへ追記して読み込む。
        |--------------------------------------------------------------------------
        */
        if (isRequireDev()) {
            $providers = config(\App::environment() . '.app.providers', []);
            foreach ($providers as $index => $provider) {
                if (class_exists($provider)) {
                    $this->app->register($provider);
                }
            }

            $aliases = config('develop.app.aliases', []);
            foreach ($aliases as $alias => $facade) {
                if (class_exists($facade)) {
                    $this->app->alias($alias, $facade );
                }
            }
        }
function isRequireDev()
    {
        return in_array(\App::environment(), ['local', 'develop']);
    }

つまり、--env=localか--env=developを付与してphp artisan ide-helper:generateを実行しないとそんなクラスないってことでエラーがでます。

これを回避する良い方法は何かないでしょうか?

composer.jsonのpost-update-cmdで冒頭のConsoleを読み込んでいます。

"post-update-cmd": [
      "php artisan post:cmd update",
      "php artisan optimize"
    ]

jsonの中でenvを取得できればいいのですが、、、

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

単純にexec関数で解決。

"post-update-cmd": [
      "php artisan post:cmd update",
      "php artisan optimize"
    ]
private function update()
    {
        $argument = $this->argument('argument');
        $this->info('post-' . $argument . '-cmdを実行します。');
//        $this->call('ide-helper:meta  --env=local'); // これはNG
        exec('php artisan ide-helper:generate --env=' . $this->environment);
    }

.envだけ用意していれば$this->call('ide-helper:meta')などでも問題ないが、今回

.env.xxxx
.env.yyyy
.env.zzzz

のような環境に応じたenvファイルを用意していたため、artisanコマンドを実行する際には--env=xxxxなどと付与して実行しないとenvファイルを読み込めないため、エラーがでていた。

そもそも論として、手動でphp artisan ide-helper:generate --env=localなどとするのが面倒なのと開発者の知見度に依存することなく開発効率をあげたいことから、composer pudateさえ実行すればpost-update-cmdで必要な処理をまとめて全部任せられるような仕組みを作りたかった。

しかし、composer.jsonでは現在の環境変数を取得できないので、更にcomsoleを呼び出し、そこで現在の環境変数を取得し、必要なartisanコマンドを実行するようにした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

プロジェクトルートに「.env.local」なり「.env.develop」なりのファイルは存在していますでしょうか。
--envオプションは、名前に合わせて.envファイルを読み替えているにすぎません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/03 14:46

    さすがにファイルは用意しています。

    キャンセル

0

そもそもpost-update-cmdで実行する必要がない。
ide-helperのREADMEには書いてあるけど別に毎回自動で実行しないといけない理由はないので必要な時に手動でやればいいだけのこと。

自分の場合はpackage.jsonに書いてる。PhpStormはnpm scriptのほうがすぐに実行できるから。

    "scripts": {
        ...
        "ide-helper:meta": "php artisan ide-helper:meta",
        "ide-helper:generate": "php artisan ide-helper:generate",
        "ide-helper:models": "php artisan ide-helper:models -N"
    },

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/03 14:50 編集

    手動で実行するのはcomposer だけにしたいので、プログラム側で現在の環境を判断したいので
    `php artisan ide-helper:generate --env=****`
    を実行したいのです。

    開発環境構築用のシェルをいづれ作るのでcomposer installやupdate自体もスクリプトで実行させる予定なので、やはりプログラム側でartisan実行できる方が良いです。

    npm使えば良いですが、必ず使う保証はないので、そういった意味ではそちらかというとcmposer.jsonに記載しておきたいのです。

    キャンセル

  • 2018/11/03 15:03

    composer.jsonのpost-update-cmdで実行していることが問題ではなく、consoleで実行して認識されないことが問題となっています。


    composer.jsonのpost-update-cmd
    php artisan ide-helper:generate --env=develop

    これはOK。

    composer.jsonのpost-update-cmdでconsole呼び出し
    $this->call('ide-helper:generate --env=develop');

    これはNG。

    $ composer update
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Nothing to install or update
    Generating optimized autoload files
    > Illuminate\Foundation\ComposerScripts::postAutoloadDump
    > @php artisan package:discover
    Discovered Package: barryvdh/laravel-debugbar
    Discovered Package: barryvdh/laravel-ide-helper
    Discovered Package: fideloper/proxy
    Discovered Package: laravel/tinker
    Discovered Package: laravelcollective/html
    Discovered Package: nesbot/carbon
    Package manifest generated successfully.
    > php artisan post:cmd update
    post-update-cmdを実行します。


    Command "ide-helper:generate --env=local" is not defined.

    Did you mean one of these?
    ide-helper:eloquent
    ide-helper:generate
    ide-helper:meta
    ide-helper:models


    Script php artisan post:cmd update handling the post-update-cmd event returned with error code 1

    キャンセル

  • 2018/11/03 15:03

    なのでpackage.jsonで実行することが解決方法ではないのです。。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る