อะไรคือความแตกต่างระหว่างส่วนที่ต้องการและต้องการ - dev ใน composer.json?


106

ฉันเริ่มใช้นักแต่งเพลงฉันรู้เรื่องนี้น้อยมากและมีประสบการณ์เล็กน้อยกับการพัฒนาเว็บแอปพลิเคชัน

ฉันเพิ่งอ่านNettuts + Tutorialดังนั้นฉันจึงมีคำถามพื้นฐานเกี่ยวกับนักแต่งเพลง

{
  "require": {
    "laravel/framework": "4.0.*",
    "way/generators": "dev-master",
    "twitter/bootstrap": "dev-master",
    "conarwelsh/mustache-l4": "dev-master"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "mockery/mockery": "0.7.*"
  },
  "autoload": {
    "classmap": [
      "app/commands",
      "app/controllers",
      "app/models",
      "app/database/migrations",
      "app/database/seeds",
      "app/tests/TestCase.php"
    ]
  },
  "scripts": {
    "post-update-cmd": "php artisan optimize"
  },
  "minimum-stability": "dev"
}
  1. สิ่งที่ปรากฏใน"require-dev"บางส่วนจะดาวน์โหลดและติดตั้งด้วยcomposer install --dev?
  2. ฉันอ่านเอกสารของนักแต่งเพลงบางส่วน แต่ยังไม่เข้าใจว่าอะไรคือเหตุผลที่เรามี"require-dev"ส่วน? เป็นเพราะเราต้องการรับแพ็คเกจเวอร์ชันเฉพาะแทนที่จะได้รับเวอร์ชันเสถียรล่าสุดหรือไม่?

ที่เกี่ยวข้อง: stackoverflow.com/q/16679589/82216

คำตอบ:


126

สภาพแวดล้อมที่แตกต่างกัน

โดยทั่วไปซอฟต์แวร์จะทำงานในสภาพแวดล้อมที่แตกต่างกัน:

  • development
  • testing
  • staging
  • production

การพึ่งพาที่แตกต่างกันในสภาพแวดล้อมที่แตกต่างกัน

การอ้างอิงซึ่งประกาศไว้ในrequireส่วนของcomposer.jsonมักจะเป็นการอ้างอิงซึ่งจำเป็นสำหรับการเรียกใช้แอปพลิเคชันหรือแพคเกจใน

  • staging
  • production

สภาพแวดล้อมในขณะที่การอ้างอิงที่ประกาศในrequire-devส่วนนี้มักเป็นการอ้างอิงซึ่งจำเป็นใน

  • developing
  • testing

สภาพแวดล้อม

ตัวอย่างเช่นนอกเหนือจากแพ็คเกจที่ใช้สำหรับการเรียกใช้แอปพลิเคชันจริงอาจจำเป็นต้องใช้แพ็คเกจสำหรับการพัฒนาซอฟต์แวร์เช่น:

  • friendsofphp/php-cs-fixer (เพื่อตรวจจับและแก้ไขปัญหารูปแบบการเข้ารหัส)
  • squizlabs/php_codesniffer (เพื่อตรวจจับและแก้ไขปัญหารูปแบบการเข้ารหัส)
  • phpunit/phpunit (เพื่อขับเคลื่อนการพัฒนาโดยใช้การทดสอบ)
  • เป็นต้น

การปรับใช้

ตอนนี้ในdevelopmentและtestingสภาพแวดล้อมคุณมักจะเรียกใช้

$ composer install

เพื่อติดตั้งทั้งสองproductionและการdevelopmentอ้างอิง

อย่างไรก็ตามในstagingและproductionสภาพแวดล้อมคุณต้องการติดตั้งการอ้างอิงซึ่งจำเป็นสำหรับการรันแอปพลิเคชันเท่านั้นและโดยปกติแล้วคุณจะเรียกใช้

$ composer install --no-dev

เพื่อติดตั้งการproductionอ้างอิงเท่านั้น

อรรถศาสตร์

กล่าวอีกนัยหนึ่งคือส่วนต่างๆ

  • require
  • require-dev

ระบุว่าcomposerควรติดตั้งแพ็คเกจใดเมื่อคุณเรียกใช้

$ composer install

หรือ

$ composer install --no-dev

นั้นคือทั้งหมด.

หมายเหตุการพัฒนาขึ้นต่อกันของแพ็กเกจแอปพลิเคชันหรือแพ็กเกจของคุณจะไม่ถูกติดตั้ง

สำหรับการอ้างอิงโปรดดู:


ฉันเข้าใจถูกต้องหรือไม่ว่าไม่สำคัญเลยหากฉัน "ปรับใช้" โดยการอัปโหลดทั้งvendorโฟลเดอร์ผ่าน FTP
pilat

2
@pilat คุณทำได้ แต่อย่าลืมติดตั้งด้วย—no-devไฟล์. นอกจากนี้ FTP อาจจะค่อนข้างช้า
localheinz

การอ้างอิงที่คุณต้องการเพื่อสร้างแอปพลิเคชันของคุณเท่านั้นล่ะ? ดังนั้นในการสร้างและปรับใช้ไปป์ไลน์ฉันต้องการติดตั้งเพื่อสร้างและลบออกอีกครั้งก่อนที่จะปรับใช้ เช่นสำหรับการลดขนาดหรือเปลี่ยน LESS / SASS เป็น css คุณจะทำอย่างไร?
Richard Kiefer

1
@RichardKiefer บางคนใช้phar.ioอื่น ๆ ตรวจสอบใน PHARs ยังคนอื่น ๆ ใช้ภาพหางและยังมีบางคนใช้แยกcomposer.json- ดูตัวอย่างgithub.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz

คุณจะยอมรับเพียง comper.json และล็อคไปที่ repo ของคุณหรือไม่? มันสมเหตุสมผลกว่าไหมที่จะยอมรับทุกอย่างและสำหรับการปรับใช้เพียงแค่ดึงสาขาหลักจากการผลิตโดยใช้ git?
mbomb007

62
  1. ตามคู่มือของนักแต่งเพลง :

    ต้องการ dev (รูทเท่านั้น)

    แสดงรายการแพ็กเกจที่จำเป็นสำหรับการพัฒนาแพ็กเกจนี้หรือรันการทดสอบเป็นต้นข้อกำหนดด้านการพัฒนาของแพ็กเกจรูทถูกติดตั้งตามค่าเริ่มต้น ทั้งสองinstallหรือupdateสนับสนุน--no-devอ็อพชันที่ป้องกันไม่ให้ติดตั้ง dev dependencies

    ดังนั้นการรันcomposer installจะดาวน์โหลดการอ้างอิงการพัฒนาด้วย

  2. เหตุผลนั้นง่ายมาก เมื่อมีส่วนร่วมในไลบรารีเฉพาะคุณอาจต้องการเรียกใช้ชุดทดสอบหรือเครื่องมือพัฒนาอื่น ๆ (เช่น symfony) แต่ถ้าคุณติดตั้งไลบรารีนี้ลงในโปรเจ็กต์อาจไม่จำเป็นต้องมีการอ้างอิงการพัฒนาเหล่านั้น: ไม่ใช่ทุกโปรเจ็กต์ที่ต้องมีผู้ทดสอบ


19

จากเว็บไซต์ผู้แต่ง (ชัดเจนพอ)

จำเป็นต้อง#

แสดงรายการแพ็คเกจที่ต้องการโดยแพ็คเกจนี้ แพคเกจจะไม่ถูกติดตั้งเว้นแต่จะสามารถปฏิบัติตามข้อกำหนดเหล่านั้นได้

ต้องใช้ dev (รูทเท่านั้น) #

แสดงรายการแพ็กเกจที่จำเป็นสำหรับการพัฒนาแพ็กเกจนี้หรือรันการทดสอบเป็นต้นข้อกำหนดด้านการพัฒนาของแพ็กเกจรูทถูกติดตั้งตามค่าเริ่มต้น ทั้งการติดตั้งหรืออัปเดตรองรับอ็อพชัน --no-dev ที่ป้องกันไม่ให้ติดตั้ง dev dependencies

การใช้ need-dev ใน Composer คุณสามารถประกาศการอ้างอิงที่คุณต้องการสำหรับการพัฒนา / ทดสอบโครงการ แต่ไม่จำเป็นต้องใช้ในการผลิต เมื่อคุณอัปโหลดโปรเจ็กต์ไปยังเซิร์ฟเวอร์ที่ใช้งานจริง (โดยใช้ git) require-devส่วนจะถูกละเว้น

ตรวจสอบคำตอบที่โพสต์โดยผู้เขียนและโพสต์นี้ด้วย


3
โปรดอธิบายฉันว่าทำไม "way / generators": "dev-master" อยู่ในส่วน "ต้องใช้"? ฉันไม่ต้องการใช้ในการผลิตอีกต่อไป
Artisan

1
นี่เป็นการคาดเดาทั้งหมด แต่สิ่งเดียวที่ฉันคิดได้ก็คือเนื่องจากวิธี / เครื่องกำเนิดไฟฟ้าถูกเพิ่มเป็นผู้ให้บริการหากไม่มีในสภาพแวดล้อมการผลิต Laravel จะไม่ทำงาน
Daniel Hollands

2
ส่วนความต้องการ dev ของแพ็กเกจรูทได้รับการติดตั้งโดยค่าเริ่มต้นระบุไว้อย่างชัดเจนว่ามีการติดตั้ง Depencies จาก require-dev แม้ในเซิร์ฟเวอร์ที่ใช้งานจริง
Gemmu

3
แนวคิดคือคุณจะใช้แฟล็ก --no-dev ในการผลิต
John Pancoast

2

ต้องการส่วนส่วน นี้ประกอบด้วยแพ็คเกจ / การอ้างอิงซึ่งเป็นตัวเลือกที่ดีกว่าที่จะติดตั้ง / จำเป็นในสภาพแวดล้อมการใช้งานจริง

ส่วนที่ต้องการ - dev:ส่วนนี้มีแพ็กเกจ / การอ้างอิงซึ่งนักพัฒนาสามารถใช้เพื่อทดสอบโค้ดของเธอ (หรือเพื่อทดลองบนเครื่องในพื้นที่ของเธอและเธอไม่ต้องการให้แพ็คเกจเหล่านี้ติดตั้งในสภาพแวดล้อมการใช้งานจริง)


1

กฎทั่วไปคือคุณต้องการแพ็กเกจจากส่วนrequire-devเฉพาะในสภาพแวดล้อมการพัฒนา (dev) ตัวอย่างเช่นสภาพแวดล้อมในเครื่อง

แพ็กเกจในส่วนneed-devคือแพ็คเกจที่ช่วยคุณดีบักแอพรันการทดสอบและอื่น ๆ

ในการจัดเตรียมและสภาพแวดล้อมการผลิตคุณอาจต้องการเฉพาะแพ็กเกจจากส่วนที่ต้องการ

แต่อย่างไรก็ตามคุณสามารถเรียกใช้การติดตั้งคอมโพสิต --no-devและการอัปเดตผู้แต่ง - ไม่มี-devในสภาพแวดล้อมใด ๆ คำสั่งจะติดตั้งเฉพาะแพ็คเกจจากส่วนที่ต้องการไม่ใช่จากrequire-devแต่คุณอาจต้องการเรียกใช้สิ่งนี้ในการจัดเตรียมและการผลิตเท่านั้นสภาพแวดล้อมไม่ได้อยู่ในท้องถิ่น

ในทางทฤษฎีคุณสามารถวางแพ็กเกจทั้งหมดในส่วนที่ต้องการและจะไม่มีอะไรเกิดขึ้น แต่คุณไม่ต้องการพัฒนาแพ็กเกจในสภาพแวดล้อมการผลิตเนื่องจากเหตุผลต่อไปนี้:

  1. ความเร็ว
  2. ศักยภาพในการเปิดเผยข้อมูลการดีบักบางอย่าง
  3. ฯลฯ

ผู้สมัครที่ดีบางคนสำหรับneed-devได้แก่ :

"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"

คุณสามารถดูว่าแพ็คเกจด้านบนกำลังทำอะไรอยู่และคุณจะเห็นว่าทำไมคุณไม่ต้องการใช้ในการผลิต

ดูเพิ่มเติมที่นี่: https://getcomposer.org/doc/04-schema.md


0

โปรดสังเกตว่าต้องใช้ dev (รูทเท่านั้น) !

ซึ่งหมายความว่าส่วนneed-devจะใช้ได้ก็ต่อเมื่อแพ็กเกจของคุณเป็นรูทของโปรเจ็กต์ทั้งหมด กล่าวคือถ้าคุณเรียกใช้composer updateจากโฟลเดอร์แพ็คเกจของคุณ

หากคุณพัฒนาปลั๊กอินสำหรับโปรเจ็กต์หลักบางโปรเจ็กต์ซึ่งมีเป็นของตัวเอง composer.json ส่วนที่ต้องการ - devของคุณจะถูกละเว้นโดยสิ้นเชิง หากคุณต้องการการพึ่งพาการพัฒนาของคุณคุณต้องย้ายRequire-devของคุณไปที่ composer.json ในโปรเจ็กต์หลัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.