как настроить игнорирование нулевой проверки в режиме выпуска с помощью сборки flutter

#flutter

Вопрос:

Сейчас я компилирую проект в режиме выпуска, скажите мне, что какой-то пакет не поддерживал проверку на нуль.

 This will generate a JSON format file containing all messages that
    need to be translated.
    ../../.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-2.2.0/lib/messages.dart:4:1: Error: A
    library can't opt out of null safety by default, when using sound null safety.
    // @dart = 2.8
    ^^^^^^^^^^^^^^
    ../../.pub-cache/hosted/pub.flutter-io.cn/wakelock_platform_interface-0.1.0 1/lib/messages.dart:4:1: Error: A
    library can't opt out of null safety by default, when using sound null safety.
    // @dart = 2.8
    ^^^^^^^^^^^^^^
    Error: Cannot run with sound null safety, because the following dependencies
    don't support null safety:

     - package:shared_preferences
     - package:timeago
     - package:hive
     - package:hive_flutter
     - package:state_notifier
     - package:fish_redux
     - package:flutter_hooks
     - package:shared_preferences_linux
     - package:shared_preferences_platform_interface
     - package:shared_preferences_windows
     - package:crypto
     - package:path_provider
     - package:path_provider_linux
     - package:path_provider_windows
     - package:path_provider_platform_interface
     - package:xdg_directories
     - package:convert
     - package:plugin_platform_interface
     - package:pull_to_refresh
     - package:flutter_icons
     - package:animations
     - package:flutter_slidable
     - package:http
     - package:fluttertoast
     - package:share
     - package:flutter_secure_storage
     - package:logger
     - package:dio
     - package:intl_phone_number_input
     - package:url_launcher
     - package:flutter_html
     - package:mime
     - package:http_parser
     - package:url_launcher_platform_interface
     - package:webview_flutter
     - package:uni_links
     - package:equatable
     - package:libphonenumber
     - package:csslib
     - package:html
     - package:flutter_layout_grid
     - package:chewie
     - package:chewie_audio
     - package:video_player
     - package:shimmer
     - package:video_player_platform_interface
     - package:quiver
     - package:wakelock
     - package:wakelock_platform_interface

    For solutions, see https://dart.dev/go/unsound-null-safety

    Command PhaseScriptExecution failed with a nonzero exit code
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description
 

как игнорировать нулевую проверку в режиме выпуска в flutter при сборке приложения в fastlane? Я уже знаю, что нужно добавлять параметр при сборке в локальном режиме, как это:

 ~/apps/flutter/bin/flutter build ios --release --no-sound-null-safety
 

как добавить --no-sound-null-safety в режим выпуска сборки xcode в качестве параметра сборки по умолчанию?

Ответ №1:

Прямо сейчас пакеты все еще настраиваются на нулевую безопасность, поэтому до тех пор вам придется отказаться от нулевой безопасности во время сборки, изменив свой main.dart, например

 // @dart=2.9
import 'src/my_app.dart';

main() {
  //...
}
 

Это //@dart=2.9 должно сработать. Если нет, попробуйте изменить версию среды в pubspec.yaml, например

 environment:
  sdk: ">=2.7.0 <3.0.0"
 

Комментарии:

1. как сделать так, чтобы fastlane добавлял --no-sound-null-safety конфигурацию при сборке @Siddharth Agrawal

2. Я не мог понизить версию, потому что весь код, который я изменил на нулевую безопасность @Siddharth Agrawal

Ответ №2:

Я также столкнулся с проблемой, когда мне нужно было обновить версию min SDK для несвязанных языковых функций, и я вынужден устранять проблемы с безопасностью null, в то же время мне все еще нужно выполнять сборки по умолчанию для обеспечения безопасности null до тех пор, пока все зависимости, над которыми я не имею контроля, не будут преобразованы. Документация по этому вопросу, мягко говоря, ужасна, и тот факт, что нет простого способа отключить это pubspec.yaml , просто смешон.

Немного покопавшись в исходном коде Flutter, я обнаружил, что --no-sound-null-safety передача флага осуществляется через переменную EXTRA_FRONT_END_OPTIONS среды. Вы должны быть в состоянии принудительно включить его, просто добавив его в свои определения среды. Для Linux и Windows взлома CMakeLists.txt было достаточно, чтобы отключить его по умолчанию:

   COMMAND ${CMAKE_COMMAND} -E env
    # Temporarily disable null safety checks until all packages have migrated
    EXTRA_FRONT_END_OPTIONS=--no-sound-null-safety
    ${FLUTTER_TOOL_ENVIRONMENT}
    "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
 

Я также требовал этого, чтобы такие вещи, как сборки snapcraft, работали, так как там нет возможности управлять параметрами сборки.

Ответ №3:

Я нашел в файле рабочего процесса действий GitHub добавить шаг(не нужно добавлять в Fastlane):

 - run: flutter build ios --release --no-codesign --no-sound-null-safety
 

исправил бы это(с момента обновления до flutter 2.0.1). Это полный файл рабочего процесса:

 name: Cruise-CI

on:
  push:
    branches: [ main ]

jobs:
  build:
    #
    # more macOS version:
    # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md
    #
    runs-on: macos-10.15
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: '12.x'
      - uses: subosito/flutter-action@v1
        with:
          flutter-version: '2.0.1'
      #
      # more xcode version path:
      # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md
      #
      - name: Select Xcode version
        run: sudo xcode-select -s '/Applications/Xcode_12.4.app/Contents/Developer'
      - name: Bundle install
        run: |
          cd ./ios
          brew install gpg
          curl -sSL https://rvm.io/mpapis.asc | gpg --import -
          curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -
          echo 409B6B1796C275462A1703113804BB82D39DC0E3:6: | gpg --import-ownertrust
          echo 7D2BAF1CF37B13E2069D6956105BD0E739499BDB:6: | gpg --import-ownertrust
          curl -sSL https://get.rvm.io | bash -s -- --ignore-dotfiles
          source $HOME/.rvm/scripts/rvm
          source ~/.bash_profile
          rvm --version
          rvm install 2.7.2
          rvm use --default 2.7.2
          gem install cocoapods -v 1.10.0
          gem install fastlane -v 2.177.0
          bundle install
      - name: Install tools
        run: |
          flutter precache
          flutter pub get
          cd ./ios
          pod install
      #- run: flutter pub get
      #- run: flutter build apk
      - run: flutter build ios --release --no-codesign --no-sound-null-safety
      - name: Setup SSH Keys and known_hosts for fastlane match
        run: |
          SSH_PATH="$HOME/.ssh"
          mkdir -p "$SSH_PATH"
          touch "$SSH_PATH/known_hosts"
          echo "$PRIVATE_KEY" > "$SSH_PATH/id_rsa"
          chmod 700 "$SSH_PATH"
          ssh-keyscan github.com >> ~/.ssh/known_hosts
          chmod 600 "$SSH_PATH/known_hosts"
          chmod 600 "$SSH_PATH/id_rsa"
          eval $(ssh-agent)
          ssh-add "$SSH_PATH/id_rsa"
        env:
          PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      - name: Deploy to TestFlight/PGY
        run: |
          cd ./ios
          bundle exec fastlane beta
        env:
          FLUTTER_ROOT: ${{ secrets.FLUTTER_ROOT }}
          APPLE_ID: ${{ secrets.APPLE_ID }}
          GIT_URL: ${{ secrets.GIT_URL }}
          PGY_USER_KEY: ${{ secrets.PGY_USER_KEY }}
          PGY_API_KEY: ${{ secrets.PGY_API_KEY }}
          TEAM_ID: ${{ secrets.TEAM_ID }}
          ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }}
          FASTLANE_USER: ${{ secrets.FASTLANE_USER }}
          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
          FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }}
          FASTLANE_SESSION: ${{ secrets.FASTLANE_SESSION }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }}
          MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }}
          DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS: ${{ secrets.DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS }}