class Fastlane::Actions::FlutterBuildAction

Constants

FASTLANE_PLATFORM_TO_BUILD

Public Class Methods

available_options() click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 146
      def self.available_options
        [
          FastlaneCore::ConfigItem.new(
            key: :build,
            env_name: 'FL_FLUTTER_BUILD',
            description: 'Type of Flutter build (e.g. apk, appbundle, ios)',
            optional: true,
            type: String,
          ),
          FastlaneCore::ConfigItem.new(
            key: :debug,
            env_name: 'FL_FLUTTER_DEBUG',
            description: 'Build a Debug version of the app if true',
            optional: true,
            type: Boolean,
            default_value: false,
          ),
          FastlaneCore::ConfigItem.new(
            key: :codesign,
            env_name: 'FL_FLUTTER_CODESIGN',
            description: 'Set to false to skip iOS app signing. This may be ' \
            'useful e.g. on CI or when signed later by Fastlane "sigh"',
            optional: true,
            type: Boolean,
          ),
          FastlaneCore::ConfigItem.new(
            key: :build_number,
            env_name: 'FL_FLUTTER_BUILD_NUMBER',
            description: 'Override build number specified in pubspec.yaml',
            optional: true,
            type: Integer,
          ),
          FastlaneCore::ConfigItem.new(
            key: :build_name,
            env_name: 'FL_FLUTTER_BUILD_NAME',
            description: <<-'DESCRIPTION',
              Override build name specified in pubspec.yaml.
              NOTE: for App Store, build name must be in the format of at most 3
                    integeres separated by a dot (".").
            DESCRIPTION
            optional: true,
          ),
          FastlaneCore::ConfigItem.new(
            key: :build_args,
            description: 'An array of extra arguments for "flutter build"',
            optional: true,
            type: Array,
          ),
        ]
      end
category() click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 138
def self.category
  :building
end
description() click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 134
def self.description
  'Run "flutter build" to build a Flutter application'
end
process_build_output(output, build_args) click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 119
def self.process_build_output(output, build_args)
  artifacts = output.scan(/Built (.*?)(:? \([^)]*\))?\.$/).
              map { |path| File.absolute_path(path[0]) }
  if artifacts.size == 1
    lane_context[SharedValues::FLUTTER_OUTPUT] = artifacts.first
  elsif artifacts.size > 1
    # Could be the result of "flutter build apk --split-per-abi".
    lane_context[SharedValues::FLUTTER_OUTPUT] = artifacts
  elsif build_args.include?('--config-only')
    UI.message('Config-only "build" detected, no output file name')
  else
    UI.important('Cannot parse built file path from "flutter build"')
  end
end
process_deprecated_params(params, build_args) click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 101
      def self.process_deprecated_params(params, build_args)
        unless params[:codesign].nil?
          UI.deprecated(<<-"MESSAGE")
flutter_build parameter "codesign" is deprecated. Use

  flutter_build(
    build_args: ["--#{params[:codesign] == false ? 'no-' : ''}codesign"]
  )

form instead.
          MESSAGE

          if params[:codesign] == false
            build_args.push('--no-codesign')
          end
        end
      end
publish_gym_defaults(build_args) click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 83
def self.publish_gym_defaults(build_args)
  ENV['GYM_WORKSPACE'] ||= 'ios/Runner.xcworkspace'
  ENV['GYM_BUILD_PATH'] ||= 'build/ios'
  ENV['GYM_OUTPUT_DIRECTORY'] ||= 'build'
  unless ENV.include?('GYM_SCHEME')
    # Do some parsing on args. Is there a less ugly way?
    build_args.each.with_index do |arg, index|
      if arg.start_with?('--flavor', '-flavor')
        if arg.include?('=')
          ENV['GYM_SCHEME'] = arg.split('=', 2).last
        else
          ENV['GYM_SCHEME'] = build_args[index + 1]
        end
      end
    end
  end
end
return_value() click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 142
def self.return_value
  'A path to the built file, if available'
end
run(params) click to toggle source
# File lib/fastlane/plugin/flutter/actions/flutter_build_action.rb, line 19
def self.run(params)
  # "flutter build" args list.
  build_args = []

  if params[:build]
    build_args.push(params[:build])
  else
    if fastlane_platform = (lane_context[SharedValues::PLATFORM_NAME] ||
                            lane_context[SharedValues::DEFAULT_PLATFORM])
      build_args.push(FASTLANE_PLATFORM_TO_BUILD[fastlane_platform])
    else
      UI.user_error!('flutter_build action "build" parameter is not ' \
      'specified and cannot be inferred from Fastlane context.')
    end
  end

  process_deprecated_params(params, build_args)

  if params[:debug]
    build_args.push('--debug')
  end

  if build_number = (params[:build_number] ||
                     lane_context[SharedValues::BUILD_NUMBER])
    build_args.push('--build-number', build_number.to_s)
  end

  if build_name = (params[:build_name] ||
                   lane_context[SharedValues::VERSION_NUMBER])
    build_args.push('--build-name', build_name.to_s)
  end

  build_args += params[:build_args] || []

  Helper::FlutterHelper.flutter('build', *build_args) do |status, res|
    if status.success?
      process_build_output(res, build_args)
      # gym (aka build_ios_app) action call may follow build; let's help
      # it identify the project, since Flutter project structure is
      # usually standard.
      publish_gym_defaults(build_args)
    else
      # Print stdout from "flutter build" because it may contain useful
      # details about failures, and it's normally not very verbose.
      UI.command_output(res)
    end
    # Tell upstream to NOT ignore error.
    false
  end

  # Fill in some well-known context variables so that next commands may
  # pick them up.
  case params[:build]
  when 'apk'
    lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] =
      lane_context[SharedValues::FLUTTER_OUTPUT]
  when 'appbundle'
    lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH] =
      lane_context[SharedValues::FLUTTER_OUTPUT]
  end

  lane_context[SharedValues::FLUTTER_OUTPUT]
end