본문 바로가기
Flutter

Flutter Null Safety 적용안된 package 직접 Migration 하기 (pub.dev package)

by Empering 2021. 5. 16.
반응형

시작하기 전에...


💡
pub.dev에 올라와 있는 flutter_coupang_ad 0.1.0 을 Migraation 해보는 것으로 했습니다. 기존에 작업 중인 프로젝트도 동일한 방법으로 진행하시면 되지만, 불의의 사고를 대비해 기존 코드 복구할 방법을 꼭 마련하고 진행하세요!

pub.dev의 각 package 마다 Repository가 모두 존재하는데, 해당 Repository를 fork 해서 수정한 다음 직접 수정한 git repository를 pubsepc.yaml의 git url로 지정해서 사용하는 방법을 소개합니다.

일부 단계를 제외하고 기존 프로젝트를 마이그레이션 하는 방법과 동일하기때문에 순서대로 따라해주시면 간단하게 적용 합니다.

Null Safety 적용할 package 다운로드 받기


  1. 샘플로 적용해볼 flutter_coupang_ad 0.1.0를 pub.dev에서 찾아봅니다.
    flutter_coupang_ad | Flutter Package
    쿠팡 파트너스에서 제공하는 광고 배너 뷰를 사용할 수 있도록 구현해 놓은 패키지입니다. ** 본 패키지는 쿠팡 파트너스에서 정식 제공하는 플러그인이 아닙니다. ** 쿠팡 파트너스에서 제공하는 광고에 대한 자세한 사항은 쿠팡 파트너스 에서 확인하세요.
    https://pub.dev/packages/flutter_coupang_ad
  1. 우측 메뉴중 Repository (GitHub)을 눌러 해당 Repo로 이동합니다.
  1. GitHub에서 Fork를 눌러 개인 Repo에 Fork 합니다.
  1. fork된 Repo Clone 합니다.

    Android Studio 기준

    1. File → New → Project from Version Control... 클릭
    1. Fork 한 Repo Clone

      아래 2가지 방법중 편하신 방법으로 진행하시면 됩니다.

      1. Repo url 입력 후 Clone
      1. GitHub 계정이 연동된 경우 해당 Repo 선택 후 Clone

flutter SDK Upgrade


flutter 버전이 2.0 미만이라면 아래 과정을 통해 flutter SDK를 업그레이드 합니다. 만약 flutter 2.0 이상 버전인경우 마이그레이션 단계로 바로 진행하시면 됩니다.

  1. flutter SDK version 확인
    > flutter --version
      Flutter 2.0.6 • channel stable • https://github.com/flutter/flutter.git
      Framework • revision 1d9032c7e1 (2 weeks ago) • 2021-04-29 17:37:58 -0700
      Engine • revision 05e680e202
      Tools • Dart 2.12.3
  1. flutter channel 확인
    > flutter channel
      Flutter channels:
        master
        dev
        beta
      * stable
  1. stable이 아니라면 channel 변경
    > flutter channel stable
  1. SDK 업그레이드
    > flutter upgrade
      Checking Dart SDK version...
      Downloading Dart SDK from Flutter engine 05e680e202af9a92461070cb2d9982acad46c83c...
      Building flutter tool...
      Running pub upgrade...
      Flutter is already up to date on channel stable
      Flutter 2.0.6 • channel stable • [https://github.com/flutter/flutter.git](https://github.com/flutter/flutter.git)
      Framework • revision 1d9032c7e1 (2 weeks ago) • 2021-04-29 17:37:58 -0700
      Engine • revision 05e680e202
      Tools • Dart 2.12.3
  1. flutter SDK 버전 재확인
    > flutter --version
      Flutter 2.0.6 • channel stable • https://github.com/flutter/flutter.git
      Framework • revision 1d9032c7e1 (2 weeks ago) • 2021-04-29 17:37:58 -0700
      Engine • revision 05e680e202
      Tools • Dart 2.12.3

Migration


외부 의존성 업그레이드 (pubspec.yaml)

  1. null safety 적용 안된 의존성 체크
    > dart pub outdated --mode=null-safety
      Resolving...
      Showing dependencies that are currently not opted in to null-safety.
      [✗] indicates versions without null safety support.
      [✓] indicates versions opting in to null safety.
      
      Computing null safety support...
      All your dependencies declare support for null-safety.

    coupang_ad 0.1.0에서는 null safety를 지원하는 의존성만 존재합니다. (사실 외부 의존성 lib 이 없었어요...)

    null safety를 지원하지 않는 의존성이 존재하는 경우 아래와 같은 메세지가 표시됩니다.

    > dart pub outdated --mode=null-safety
      Resolving...
      Showing dependencies that are currently not opted in to null-safety.
      [✗] indicates versions without null safety support.
      [✓] indicates versions opting in to null safety.
      
      Computing null safety support...
      Package Name                      Current  Upgradable  Resolvable  Latest
      
      direct dependencies:
      flutter_plugin_android_lifecycle  ✗1.0.7   ✗1.0.11     ✓2.0.1      ✓2.0.1
      plugin_platform_interface         ✗1.0.2   ✗1.0.3      ✓2.0.0      ✓2.0.0
      stream_transform                  ✗1.2.0   ✗1.2.0      ✓2.0.0      ✓2.0.0
      
      2 upgradable dependencies are locked (in pubspec.lock) to older versions.
      To update these dependencies, use `dart pub upgrade`.
      
      3  dependencies are constrained to versions that are older than a resolvable version.
      To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
  1. 의존성 null safety 적용된 버전으로 업그레이드

    dart pub outdated --mode=null-safety 명령 수행 후 표시되는 내용을 수행해주시면 됩니다.

    의존성에 Resolvable 버전이 명시되어 있다면 아래 2가지 방법 중 하나를 선택하여 처리 합니다.

    1. 각 의존성을 해당 버전으로 업그레이드
    1. dart pub upgrade --null-safety 명령으로 일괄 처리

    두가지 방법 모두 pubspec.yaml 파일의 해당 의존성 버전을 Resolvable로 변경하는 작업입니다.

    > dart pub upgrade --null-safety
      
      Changed 5 dependencies!
      3 packages have newer versions incompatible with dependency constraints.
      Try `dart pub outdated` for more information.
      
      Changed 4 constraints in pubspec.yaml:
      meta: ^1.0.5 -> ^1.3.0
      flutter_plugin_android_lifecycle: ^1.0.7 -> ^2.0.1
      plugin_platform_interface: ^1.0.1 -> ^2.0.0
      stream_transform: ^1.2.0 -> ^2.0.0
  1. 정상처리 되었는지 다시확인
    > dart pub outdated --mode=null-safety
      
      Resolving...
      Showing dependencies that are currently not opted in to null-safety.
      [✗] indicates versions without null safety support.
      [✓] indicates versions opting in to null safety.
      
      Computing null safety support...
      All your dependencies declare support for null-safety.

    마지막 2라인의 메세지가 위와같이 표시된다면 의존성 업그레이드 작업은 완료 입니다.

  1. 만약 null safety 버전이 적용 된 버전이 없는 경우...

    null safety 적용되도록 직접 마이그레이션을 해주시거나, (현재 방법을 재귀호출??)

    해결이 불가능 한경우 실행 및 빌드 시 --no-sound-null-safety 옵션을 추가하여 null safety 적용 안된 소스와 같이 사용 할 수도 있습니다.

프로젝트 마이그레이션

  1. 마이그레이션 명령 실행
    > dart migrate
      Migrating C:\project\flutter\flutter-coupang_ad
      
      See https://dart.dev/go/null-safety-migration for a migration guide.
      
      Note: more than one project found; migrating the top-level project.
      
      Analyzing project...
      [-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\]
      No analysis issues found.
      
      Generating migration suggestions...
      [------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------]
      
      Compiling instrumentation information...
      [------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------]
      
      View the migration suggestions by visiting:
      
        http://127.0.0.1:6105/C:/project/flutter/flutter-coupang_ad?authToken=Gle7ozKMfnY%3D
      
      Use this interactive web view to review, improve, or apply the results.
      When finished with the preview, hit ctrl-c to terminate this process.
      
      If you make edits outside of the web view (in your IDE), use the 'Rerun from
      sources' action.
  1. 마이그레이션 추천 소스 확인

    콘솔에 표시되는 내용 중 URL 주소가 나오는데, 해당 주소로 접속하여 migration suggestion을 확인합니다.

    null 가능성이 있는 변수에 ?를 추가하거나,

    @requiredrequired 로 변경되는 내용이 주로 나왔습니다.

    특이 사항이 없는 것 같아 APPLY MIGRATION으로 migration을 진행합니다.

  1. 최종 적용
    Applying migration suggestions to disk...
      Migrated 4 files:
          lib\flutter_coupang_ad.dart
          test\flutter_coupang_ad_test.dart
          pubspec.yaml
          .dart_tool\package_config.json

    APPLY MIGRATION 클릭 후 콘솔에 위와 같이 변경된 파일명이 표시되며 migration 작업은 완료됩니다. (해당 package의 소스 규모가 작아 별문제 없이 진행되었지만, 실제 프로젝트에서는 많은 수정내용이 나올 수 있습니다.)

변경한 소스를 의존성으로 사용하기


null safety 적용이 성공적으로 완료 되었다면, 개인 RepoPush 하고, 해당 Repo 주소pubspec.yaml에 입력하여 pub.dev의 package 대신 사용합니다.

  • AS-IS
    dependencies:
        flutter_coupang_ad: ^0.1.0
  • TO-BE
    dependencies:
        flutter_coupang_ad:
          git:
            url: https://github.com/empering/flutter-coupang_ad # 본인이 수정해서 push한 Repo 주소

끝!!


flutter 2.0 가 출시 된 후 시간이 조금 지난 상태라 많인 package에서 null safety를 지원 하고 있습니다. 하지만 국내에서 사용되는 package라던지 사용량이 적은 package의 경우에는 빠른 업데이트가 되고 있지 않는 것 같습니다. 아쉬운대로 기존 package를 null safety migration 하여 사용하면 어찌저찌 대처는 되지만 아쉬운 감은 여전하네요..

(물론 migration 해서 pull request를 보내서 배포가 되면 더 좋겠지만..으흠...)

반응형

'Flutter' 카테고리의 다른 글

Flutter 2.2 새롭게 추가된 것들  (0) 2021.05.21
Flutter Engage Extended Seoul Goods!  (0) 2021.05.12
Flutter 매우 간단한 무한 스크롤 만들기  (14) 2021.04.29
Flutter 앱출시 방법  (0) 2021.04.15

댓글