본문 바로가기
Tech/flutter

[flutter] packages 버전 관리 정리. ^, +, <, =, > 어떻게 써야하나?

by 패드로 2020. 8. 26.

flutter로 개발을 해다보면, 어떤 기능도 뚝딱 만들어낼 수 있는 천재나 시간이 아주 남아도는 개발자가 아니라면 패키지를 사용하게 된다.

https://pub.dev/

 

Dart packages

Pub is the package manager for the Dart programming language, containing reusable libraries & packages for Flutter, AngularDart, and general Dart programs.

pub.dev

홈페이지를 들어가면 검색창이 크게 뜨고, 거기서 원하는 패키지의 이름이나, 원하는 기능을 영어로 작성하여 검색이 가능하다.

예를 들어 calendar로 검색을 하면 관련된 패키지들이 다 보이고, 패키지 점수, 인기도, 좋아요 수 등을 확인 가능하다.

 

저 점수가 모든 걸 알려줄 순 없지만, 적어도 많은 사람이 쓰고, 평가가 좋다면 그만큼 유용한 기능들을 많이 갖고 있고 안정성 또한 높으며 버전 업데이트도 계속 제공한다고 유추해볼 수 있을 것이다. 

하나를 들어가서 보면 이런 식으로 설치가 가능하다는 설명이 있고, 개발자는 그냥 복사+붙여넣기하여 pubspec.yaml에 넣어주고 pub get을 해주면 손쉽게 패키지 이용이 가능하다.

 

이렇게 늘 이용하다보니 든 생각.

^는 왜붙이는가? 빼도 잘 동작하던데... 그래서 찾아봤다.

 

^는 무엇인가? 바로 Caret syntax!

쉽게 말해서 지정된 버전과 호환이 되는 모든 버전의 범위를 얘기하며, 예를 들어 ^1.2.3 은 1.2.3버전보다 같거나 높고 2.0.0버전보다는 낮은 모든 버전을 뜻한다.

 

결론은 위의 플러터 캘린더 패키지 설치 시

flutter_calendar_carousel: ^1.4.12

flutter_calendar_carousel: '>=1.4.12 <2.0.0'

은 같은 말이라는 것. 좀 더 쉽게 사용하기 위해 고안된 방식인듯하다.

 

*이 개념은 Dart 1.8.3버전에서 처음 나왔기 때문에 sdk 버전이 1.8.3 미만인 경우에는 제대로 동작하지 않는다.

 

^(캐롯)은 편리하게 사용하기 위함이고, traditional한 방식도 있다.

 

Traditional syntax

- 1.2.3 같이 버전 명시 시 해당 버전을 설치

- 부등호를 통해 해당 버전 이상/이하/초과/미만을 설정 가능하며 한칸 띄우고 연달아 사용 시 and(&)의 의미를 가짐.

caret과 traditional syntax를 쓸 때 주의점으로는 caret을 쓸 때에는 ' '과 같이 따옴표를 붙이지 않는다.

다만 traditional을 쓸 때에는 ' '와 같이 따옴표를 반드시 붙여줘야 제대로 동작한다.

맨 위에 any라는 "모든 버전 허용"이라는 극단적인 옵션도 있긴 한데, 설명에서 나와있듯 플러터 팀에서도 추천하지 않고있다.

 

결론:

플러터팀에서는 Caret Syntax를 통해 버전관리할것을 추천(Best Practices)

 

이외에 찾아보며 들었던 의문 자문자답

 

Q. 특정 버전을 선택해두면 제일 안정적일텐데 왜 범위 설정을 추천하는것일까?

A. 특정 많이 쓰이는 패키지들은 다른 패키지들에서도 쓰이는 경우가 많은데 이 경우 버전 관리 시 이 패키지들에서 공통적으로 사용 가능한 버전을 자동으로 선택하는 기능을 갖고있음. 특정 버전을 지정해둘 경우 조건들을 만족하지 못해 pub get이 안될 수 있음

 

Q. 가끔 보면 버전에 +숫자가 붙는 경우가 있던데 이것도 문법인가?

A. Semantic version관리의 일환이다. 플러터가 따른다는 버전 규칙 https://semver.org/lang/ko/ 로 가보면 한국어로도 번역이 되어있다.

요약하면 위와 같고, 패키지 관리자가 따라야할 내용들도 같이 들어가있는데, 이걸 따른다고 했을 때 '주'버전이 바뀌지 않는 이상 Caret syntax를 썼을 때 오류가 나는 경우는 없어야할 것이다.

의문이 든 +도 여기 내용이 있었다. 

 

"빌드 메타데이터는 수버전이나 정식배포 전 식별자 뒤에 더하기(+) 기호를 붙인 뒤에 마침표로 구분된 식별자를 덧붙여서 표현할 수 있다. 식별자는 반드시 아스키 문자와 숫자와 붙임표로만 구성한다 [0-9A-Za-z-]. 식별자는 반드시 한 글자 이상으로 한다. 빌드 메타데이터는 버전 간의 우선순위를 판단하고자 할 때 반드시 무시해야 한다. 그러므로, 빌드 메타데이터만 다른 두 버전의 우선순위는 같다. 예: 1.0.0-alpha+001, 1.0.0+20130313144700, 1.0.0-beta+exp.sha.5114f85."

 

그!런!데! 

플러터에서는 메타 데이터로 사용되는 것이 아닌 주/부/수 이하의 더 minor한 버전 관리 용으로 쓰는듯하다.

설명과 같이 + 는 public api, 즉 유저가 사용하는 데에는 아무런 변화가 없는 경우 붙이는 버전이라고 볼 수 있고, 공식 문서에서도 1.0.0(공식 배포) 이후에는 사용하지 말것을 권하고 있다.

실제로 몇몇 패키지를 찾아보니 리팩토링, 동기,비동기 기능 추가, readme 추가 등으로 사용하는 경우가 많았다.

물론 case by case로 +18까지 숫자를 붙이면서 잡다한 업데이트를 한 패키지도 있었다.

결국 가이드는 가이드고 실제 패키지 관리자가 잘 지키느냐는 별개의 문제...

댓글