Pertanyaan Menggunakan Komposer untuk menginstal paket npm dan bower pada produksi (yaitu tidak ada devDependencies)


Dalam file composer.json saya, saya memiliki yang berikut di bagian skrip:

    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "npm install",
        "bower install"
    ]

Ketika menjalankan 'composer install' ini akan menyebabkan npm dan bower untuk menginstal semua dependensi mereka, yang secara default menyertakan devDependencies. Saat harus melakukan peluncuran produksi (mis. 'Pengarang komposer --no-dev' Saya ingin menjalankan 'npm install --production' dan 'bower install --production')

Sejauh yang saya tahu, sepertinya tidak ada cara untuk mengubah daftar yang ditentukan untuk 'post-install-command' tergantung pada flag yang dilewatkan, atau cara pengaturan variabel yang kemudian dapat diteruskan ke perintah dalam posting -instal-cmd.

Apakah saya kehilangan sesuatu? Sepertinya tidak mungkin menggunakan komposer untuk melakukan instalasi dev dan produksi hanya dengan menggunakan konfigurasi. Apakah saya benar-benar harus menggunakannya composer install --no-scripts pada produksi dan kemudian secara manual menjalankan keempat dari semua perintah itu sendiri? Itu tampak sedikit kikuk.


12
2017-08-04 15:25


asal


Jawaban:


Anda selalu dapat menggunakan PHP untuk melakukan deteksi lingkungan untuk Anda, lalu pasang dependensi lain dari skrip yang sama. Ini tidak bagus dan bersih, seperti termasuk npm dan bower di post-install-cmd, tetapi ini akan membuat Anda mendapatkan apa yang Anda cari.

"post-install-cmd": [
     "php artisan clear-compiled",
     "php artisan optimize",
     "php path/to/installer.php"
 ]

Contoh installer.php:

// Logic to determine the environment. This could be determined many ways, and depends on how your
// application's environment is determined. If you're making use of Laravel's environment
// capabilities, you could do the following:
$env = trim(exec('php artisan env'));

// Clean up response to get the value we actually want
$env = substr($env, strrpos($env, ' ') + 1);

$envFlag = ($env === 'production')
    ? '--production'
    : '';

// Install npm
passthru("npm install {$envFlag}");
// Install bower
passthru("bower install {$envFlag}");

Anda bisa membuat contoh ini lebih kuat, dan bahkan membuat perintah Artisan untuknya.


11
2017-08-28 21:26



Ini sedikit hack tetapi Anda bisa mendapatkan PID dengan perintah induk $PPID di bash. Dari situ Anda bisa mendapatkan argumen commandline.

"post-install-cmd": [
    "ps -ocommand= -p $PPID | grep no-dev > /dev/null && echo called with no-dev || echo called without no-dev",
],

Jika Anda melakukan ini, saya akan memasukkannya ke dalam skrip bash dan menjalankannya seperti ini: run-if-env-is-production.sh "bower install --production"

Saya akan merekomendasikan solusi @ kwoodfriend atas ini, karena ini kurang portabel karena memerlukan bash, ps & grep.


2
2017-09-01 12:38



Ini akan berhasil;

"post-update-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "npm install",
        "bower install"
    ],
"post-install-cmd": [
    "php artisan clear-compiled",
    "php artisan optimize",
    "npm install --production",
    "bower install --production"
]

Anda harus menjalankan 'pembaruan' di lingkungan dev Anda, dan hanya menjalankan 'pemasangan' di lingkungan produksi Anda.


1
2017-08-04 15:28



Karena saya menggunakan npm, bower dan gulp untuk membangun aset saya, saya tidak memerlukannya untuk produksi, jadi inilah komposernya. Saya menggunakan:

    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install --global bower",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent install"
    ],
    "post-update-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent update",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent update"
    ]

... Tapi kelihatannya aneh bagiku untuk menggunakan perintah rumit seperti itu untuk mendeteksi lingkungan dev, atau tidak ...


1
2017-09-15 15:03



Seluruh contoh blok dari Composer.org

{
    "scripts": {
        "post-update-cmd": "MyVendor\\MyClass::postUpdate",
        "post-package-install": [
            "MyVendor\\MyClass::postPackageInstall"
        ],
        "post-install-cmd": [
            "MyVendor\\MyClass::warmCache",
            "phpunit -c app/"
        ],
        "post-create-project-cmd" : [
            "php -r \"copy('config/local-example.php', 'config/local.php');\""
        ]
    }
}


0
2017-11-18 07:16