> 개발 도구 > composer > 본문

Composer 종속성 충돌을 방지하려면 교체 속성을 사용하세요.

藏色散人
풀어 주다: 2021-03-12 11:28:59
앞으로
3824명이 탐색했습니다.

튜토리얼 칼럼에서 작곡가의 의존성 충돌 방법을 피하기 위한 대체 속성의 사용을 소개하는 내용입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다! Composer 문서는 두 가지 기본 예를 제공합니다. 나는 그것을 설명하려고 노력할 것입니다:

이 패키지로 대체된 패키지를 나열하십시오. 이렇게 하면 패키지를 포크하고 자신의 버전 번호를 사용하여 다른 이름으로 게시할 수 있으며, 원본 패키지가 필요한 패키지는 원본 패키지를 대체하므로 포크된 패키지를 계속 사용할 수 있습니다.

귀하의 소프트웨어가 original/library가 필요한 original/libraryother/package를 사용한다고 가정해 보겠습니다.

이제 original/library에 새로운 기능을 통합해야 한다고 생각하지만 관리자는 패키지에 구현하라는 제안에 동의하지 않습니다. 따라서 better/library라는 이름으로 라이브러리를 포크하고 새 릴리스로 태그를 지정하기로 결정했습니다.

소프트웨어로 돌아갑니다. 물론 better/library 패키지를 사용하여 시작해야 하므로 대신 사용하세요. 하지만 other/package에는 여전히 original/library가 필요합니다. 반복하다! 해당 패키지가 원본/라이브러리 대신 better/library를 사용하도록 하려면 어떻게 해야 합니까? 이를 포크하고 그냥 Composer.json을 수정하는 대신(여전히 original/library와 호환되므로 작동해야 합니다)? original/libraryother/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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!