นักแต่งเพลง: ฉันจะติดตั้งการอ้างอิงอื่นโดยไม่อัปเดตตัวเก่าได้อย่างไร


196

ฉันมีโครงการที่มีการพึ่งพาไม่กี่และฉันต้องการติดตั้งอีก แต่ฉันต้องการให้คนอื่น ๆ ในแบบที่พวกเขาเป็น ดังนั้นฉันจึงแก้ไขcomposer.jsonแต่ถ้าฉันเรียกใช้composer installฉันจะได้ผลลัพธ์ต่อไปนี้:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

ก่อนอื่นฉันติดตั้ง mcrypt แล้วดังนั้นฉันไม่รู้ว่าทำไมมันถึงบ่นเกี่ยวกับเรื่องนี้

ดังนั้นฉันจะติดตั้งการพึ่งพาใหม่นี้ได้อย่างไร

ผู้ประพันธ์ของฉัน:

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}

1
คำเตือน mcrypt อาจมาจากการติดตั้ง php หลายตัว ... php ที่มีนามสกุล mcrypt อาจไม่เหมือนกับการติดตั้ง php-cli ของคุณ
Matthemattics

คำตอบ:


294

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

  1. ใช้requireคำสั่งเพียงเรียกใช้:

    composer require new/package
    

    นักแต่งเพลงที่จะคาดเดาที่ดีที่สุดข้อ จำกัด composer.lockรุ่นที่จะใช้ติดตั้งแพคเกจและเพิ่มเข้าไป

    คุณยังสามารถระบุข้อ จำกัด รุ่นที่ชัดเจนโดยการเรียกใช้:

    composer require new/package ~2.5
    

-หรือ-

  1. ใช้updateคำสั่งเพิ่มแพ็กเกจใหม่ด้วยตนเองcomposer.jsonจากนั้นรัน:

    composer update new/package
    

หากนักแต่งเพลงบ่นโดยระบุว่า "ความต้องการของคุณไม่สามารถแก้ไขเป็นชุดแพคเกจที่ติดตั้งได้" คุณสามารถแก้ไขปัญหานี้ได้โดยส่งแฟล็--with-dependenciesก สิ่งนี้จะอนุญาตรายการที่ขึ้นต่อกันทั้งหมดของแพ็คเกจที่คุณพยายามติดตั้ง / อัปเดต (แต่ไม่มีการขึ้นต่อกันอื่น ๆ ของคุณ)

เกี่ยวกับปัญหาของผู้ถามคำถามเกี่ยวกับ Laravel และ mcrypt: ตรวจสอบว่าเปิดใช้งานอย่างถูกต้องใน CLI php.ini ของคุณ ถ้าphp -mไม่มีรายการ mcrypt แสดงว่ามันหายไป

สำคัญ:อย่าลืมระบุnew/packageเมื่อใช้composer update! การข้ามอาร์กิวเมนต์นั้นจะทำให้การอ้างอิงทั้งหมดรวมถึงcomposer.lockการได้รับการปรับปรุง


3
ฉันได้รับข้อความ "ไม่ได้ติดตั้งแพคเกจ [... ] ไว้สำหรับการอัปเดตละเว้น"
เจอร์รี่

11
มันไม่ได้ผลสำหรับฉัน ฉันบอกว่าไม่ได้ติดตั้ง 'Package "x / y" ไว้สำหรับการอัปเดต ไม่สนใจ "จากนั้นมันจะทำการอัปเดตทุกอย่างดังนั้นจึงไม่ติดตั้งแพ็กเกจใหม่ที่ฉันต้องการและอัปเดตทุกอย่างอื่นซึ่งตรงกันข้ามกับสิ่งที่ฉันต้องการ
tremby

3
มันไม่ทำงาน "ความต้องการของคุณไม่สามารถแก้ไขเป็นชุดแพคเกจที่ติดตั้งได้" (และข้อความเกี่ยวกับแพ็คเกจเก่า ๆ ที่ไม่เกี่ยวข้องเลยซึ่งฉันขอ) เมื่อฉันขอให้อัปเดตหนึ่งแพ็คเกจเท่านั้น
OZ_

@tremby ใช้งานได้ดีที่นี่ บางทีคุณลืมที่จะเพิ่ม"new/package" : "*",ใน"require"ส่วนcomposer.json ?
Potherca

@OZ_ แม้ว่าจะติดตั้งเพียงหนึ่งการพึ่งพาก็ยังคงต้องได้รับการแก้ไขก่อนเพื่อให้แน่ใจว่าจะไม่ขัดแย้งกับการอ้างอิงอื่น ๆ ของคุณ
Potherca

31

จริงๆแล้วทางออกที่ถูกต้องคือ:

composer require vendor/package

นำมาจากเอกสาร CLI สำหรับนักแต่งเพลง :

requireคำสั่งเพิ่มแพคเกจใหม่ให้กับcomposer.jsonไฟล์จากไดเรกทอรีปัจจุบัน

php composer.phar require

หลังจากเพิ่ม / เปลี่ยนแปลงข้อกำหนดแล้วข้อกำหนดที่แก้ไขจะถูกติดตั้งหรืออัปเดต

หากคุณไม่ต้องการเลือกข้อกำหนดแบบโต้ตอบคุณสามารถส่งผ่านข้อกำหนดเหล่านั้นไปที่คำสั่งได้

php composer.phar require vendor/package:2.* vendor/package2:dev-master

แม้ว่าจะเป็นความจริงที่composer updateติดตั้งแพ็คเกจใหม่ที่พบใน composer.json แต่ก็จะอัปเดตไฟล์ composer.lock และแพ็กเกจที่ติดตั้งใด ๆตามตรรกะฟัซซี่ ( >หรือ*ตัวอักษรหลังโคลอน) ที่พบใน composer.json! สิ่งนี้สามารถหลีกเลี่ยงได้โดยการใช้composer update vendor/packageแต่ฉันจะไม่แนะนำให้สร้างนิสัยเพราะคุณเป็นคนหนึ่งที่ถูกลืมเรื่องการโต้เถียงจากโครงการที่อาจแตกหัก ...

รักษาสิ่งที่มีสติและยึดติดอยู่กับcomposer require vendor/packageการเพิ่มการพึ่งพาใหม่! 😉


แต่จะใช้composer requireอัปเดตไฟล์ composer.lock หรือไม่
Phil

2

กรณีการใช้งานของฉันง่ายขึ้นและเหมาะกับชื่อของคุณ แต่ไม่ใช่รายละเอียดเพิ่มเติม

นั่นคือฉันต้องการติดตั้งแพคเกจใหม่ซึ่งยังไม่ได้อยู่ในของฉันcomposer.jsonโดยไม่ต้องอัปเดตแพ็คเกจอื่น ๆ ทั้งหมด

ทางออกที่นี่คือ composer require x/y


1

ในกรณีของฉันฉันมี repo ด้วย:

  • ข้อกำหนด A, B, C, D ใน .json
  • แต่มีเพียง A, B, C ใน .lock

ในระหว่างนี้ A, B, C มีเวอร์ชันที่ใหม่กว่าด้วยความเคารพเมื่อสร้างล็อค

ด้วยเหตุผลบางอย่างฉันลบ "ผู้ขาย" และต้องการทำcomposer installและล้มเหลวด้วยข้อความ:

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

ฉันพยายามเรียกใช้โซลูชันจาก Seldaek ที่ออกcomposer update vendorD/libraryDแต่ผู้แต่งยืนยันที่จะอัปเดตสิ่งต่าง ๆ มากขึ้นดังนั้น.lockการเปลี่ยนแปลงก็เห็นเครื่องมือคอมไพล์ของฉันด้วย

วิธีแก้ปัญหาที่ฉันใช้คือ:

  1. ลบvendorsdir ทั้งหมด
  2. ชั่วคราวลบความต้องการจากVendorD/LibraryD.json
  3. composer installวิ่ง
  4. จากนั้นลบไฟล์.jsonและชำระเงินอีกครั้งจาก repo (เทียบเท่ากับการเพิ่มไฟล์อีกครั้ง แต่หลีกเลี่ยงการเปลี่ยนแปลงช่องว่างที่อาจเกิดขึ้น)
  5. จากนั้นเรียกใช้โซลูชันของ Seldaek composer update vendorD/libraryD

มันทำการติดตั้งไลบรารี แต่นอกจากนี้gitdiff ต่างแสดงให้ฉันเห็นว่าใน.lockสิ่งใหม่ ๆ เท่านั้นที่ถูกเพิ่มเข้ามาโดยไม่ต้องแก้ไขสิ่งอื่น

(ขอบคุณ Seldaek สำหรับตัวชี้;))


นั่นคือ overkill เพียงแค่ลบไฟล์ล็อคและทำการติดตั้งผู้แต่ง มันใช้งานได้
astroanu

6
สิ่งนี้ยังคงเป็นจริงสำหรับสภาพแวดล้อมที่ไม่ใช่มืออาชีพซึ่งคุณสามารถสร้างการพึ่งพาได้อย่างมีความสุขและหากมีสิ่งใดที่ทำให้คุณแตกหักและแก้ไข แต่ถ้าคุณเซิร์ฟเวอร์ที่ล้มเหลวหมายความว่าคุณสูญเสียเงิน $ 10.000 ต่อชั่วโมงคุณไม่สงสัยเลยว่าสิ่งที่composer.lockไม่ควรถูกลบและสร้างใหม่อย่างมีความสุข .lockคือ ... สำหรับล็อค !! ; D - มิฉะนั้นไฟล์ล็อคจะไร้ประโยชน์และคุณจะไม่ยอมรับหรือไม่ได้มีอยู่จริง หากคุณทำงานใน บริษัท ที่มุ่งเน้นคุณภาพและสร้างใหม่และส่งมอบการล็อกด้วยการบอกว่ามีการขึ้นต่อกัน 1,000 ครั้งพวกเขาทั้งหมดจะเปลี่ยนไปและผู้คนในระบบประกันคุณภาพจะมาฆ่าคุณฮ่าฮ่าฮ่า
Xavi Montero

2
เฮ้ @astroanu เพียงชี้แจงว่าหากคุณติดตั้งการพึ่งพาในวันที่ก่อนหน้านี้และบางส่วนของการพึ่งพานั้นได้รับการหยิบเวอร์ชันล่าสุดของนักพัฒนาซอฟต์แวร์ตัวหลักแล้วอาจมีปัญหาที่สำคัญในการเพียงแค่ลบการติดตั้ง หากคุณไม่ได้มีโอกาสตรวจสอบผลกระทบของการแนะนำการพึ่งพามีความเป็นไปได้สำหรับผลลัพธ์ที่ไม่คาดคิดและอาจสร้างประสบการณ์ที่ไม่ดีสำหรับผู้ใช้
dkcwd

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