튜토리얼 칼럼에서 작곡가의 의존성 충돌 방법을 피하기 위한 대체 속성의 사용을 소개하는 내용입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다! Composer 문서는 두 가지 기본 예를 제공합니다. 나는 그것을 설명하려고 노력할 것입니다:
이 패키지로 대체된 패키지를 나열하십시오. 이렇게 하면 패키지를 포크하고 자신의 버전 번호를 사용하여 다른 이름으로 게시할 수 있으며, 원본 패키지가 필요한 패키지는 원본 패키지를 대체하므로 포크된 패키지를 계속 사용할 수 있습니다.
귀하의 소프트웨어가original/library
가 필요한original/library
및other/package
를 사용한다고 가정해 보겠습니다. 이제original/library
에 새로운 기능을 통합해야 한다고 생각하지만 관리자는 패키지에 구현하라는 제안에 동의하지 않습니다. 따라서better/library
라는 이름으로 라이브러리를 포크하고 새 릴리스로 태그를 지정하기로 결정했습니다.
소프트웨어로 돌아갑니다. 물론 better/library
패키지를 사용하여 시작해야 하므로 대신 사용하세요. 하지만 other/package
에는 여전히 original/library
가 필요합니다. 반복하다! 해당 패키지가 원본/라이브러리
대신 better/library
를 사용하도록 하려면 어떻게 해야 합니까? 이를 포크하고 그냥 Composer.json을 수정하는 대신(여전히 original/library
와 호환되므로 작동해야 합니다)? original/library
和 other/package
,它们本身也需要 original/library
。
现在你认为 original/library
需要集成新功能,但是维护人员不同意你的建议在他们的软件包中实现。 所以你决定以 better/library
的名称派生该库,并标记一个新发行版。
回到软件。当然,它应该开始使用 better/library
包,所以要用它来代替,但 other/package
仍然需要 original/library
- 代码重复!如何让那个包使用你的 better/library
来代替 original/library
?而不需要对它进行 fork ,只需要修改 composer.json(你仍然与 original/library
兼容,所以它应该可以工作了)?
你需要增加 replace 关键字在 composer.json
:
"replace": { "original/library":"1.0.2" }
现在 Composer 知道,在解决 「other/package」的依赖关系时,任何来自 「better/library」的包都与「original/library」一样好。
这对于包含子包的包也很有用,例如,主 symfony/symfony 包包含所有 Symfony 组件,这些组件也可以作为单独的包使用。如果您需要主包,它将自动满足单个组件之一的要求,因为它将替换它们。
相同的规则,只是角度略有不同:对于需要某些功能的任何其他组件,引入框架的组件是一种不错的方法。但是,如果你在软件中需要完整的框架,而另一个库又需要该框架的组件,则该框架的 replace
声明使 Composer 不必两次安装该单个组件,因为它已经包含在完整的框架中。
注意: 替换版本中的占位符通常是不好的
在我最初的回答中,我建议:
"replace": { "original/library":"1.*" }
这带来的后果是:Composer现在将把你的库版本 1.0.0 和原来库的任何版本 1.x 一样好,即使他们在某一天修复了一些东西或添加了一些特性并发布了版本1.2.34。这也意味着,如果某一天你的「other/package」得到更新,并且需要「original/library:^1.1」,你库中的替换仍处于活动状态,并声明它可以替换任何版本 1*
,,即使你不更新内部的任何内容-这样做也无法完成,但是如果你不做任何工作,你的旧代码就永远不会实现原始库的新功能,但替换内容恰恰说明了这一点。
因此,从本质上讲:在替换版本中避免使用通配符版本! 如果使用它们,则会对你无法了解或预测的未来做出声明(除非你可以控制 original/library
,但即使这样也要非常小心)。 一定要使用你知道的并且可以完全重新实现的 original/library
composer.json
에 교체 키워드를 추가해야 합니다. rrreee🎜🎜동일한 규칙, 약간 다른 관점: 일부 기능이 필요한 다른 구성 요소와 마찬가지로 프레임워크의 구성 요소를 도입하는 것이 좋은 방법입니다. 그러나 소프트웨어에 완전한 프레임워크가 필요하고 다른 라이브러리에 해당 프레임워크의 구성 요소가 필요한 경우 프레임워크의이제 Composer는 "other/package"에 대한 종속성을 해결할 때 "better/library"의 모든 패키지가 "original"이 될 것임을 알고 있습니다. /library"도 마찬가지입니다.
이는 하위 패키지가 포함된 패키지에도 유용합니다. 예를 들어 기본 Symfony/symfony 패키지에는 별도의 패키지로도 사용할 수 있는 모든 Symfony 구성 요소가 포함되어 있습니다. 기본 패키지가 필요한 경우 개별 구성 요소 중 하나를 대체하므로 해당 요구 사항이 자동으로 충족됩니다.
replace
선언을 사용하면 해당 단일 구성 요소가 이미 전체 라이브러리에 포함되어 있으므로 Composer가 해당 단일 구성 요소를 두 번 설치할 필요가 없습니다. 액자. 🎜🎜🎜 참고: 버전에서 자리 표시자를 바꾸는 것은 일반적으로 좋지 않습니다. 🎜🎜🎜 원래 답변에서 저는 다음을 제안했습니다. 🎜rrreee🎜 결과는 다음과 같습니다. Composer는 이제 라이브러리 버전을 1.0으로 변경하므로 모든 버전 1.x만큼 좋습니다. 언젠가 뭔가를 수정하거나 일부 기능을 추가하고 버전 1.2.34를 출시하더라도 원본 라이브러리의. 이는 또한 어느 날 "기타/패키지"가 업데이트되어 "원본/라이브러리:^1.1"이 필요한 경우 라이브러리의 대체 항목이 여전히 활성 상태이며 모든 버전 1*
을 대체할 수 있다고 선언함을 의미합니다. >, 내부에 아무것도 업데이트하지 않더라도 완료되지는 않지만 아무 작업도 수행하지 않으면 이전 코드는 원래 라이브러리의 새로운 기능을 구현하지 않습니다. 그러나 대체 콘텐츠는 이를 정확하게 보여줍니다. . 🎜🎜따라서 기본적으로 대체 버전에서는 와일드카드 버전을 피하세요! 이를 사용하면 알거나 예측할 수 없는 미래에 대한 진술을 하는 것입니다( original/library
를 제어할 수 있는 경우는 제외하지만 매우 조심해야 합니다). 자신이 알고 있고 완전히 다시 구현할 수 있는 원본/라이브러리
를 사용하세요. 🎜🎜🎜원본 주소: https://stackoverflow.com/questions/18882201/how-does-the-replace-property-work-with-composer🎜🎜번역 주소: https://learnku.com/laravel/t/ 55200🎜🎜위 내용은 Composer 종속성 충돌을 방지하려면 교체 속성을 사용하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!