Cordova 使用Fastlane和Phonegap构建应用程序

Cordova 使用Fastlane和Phonegap构建应用程序,cordova,phonegap-build,fastlane,Cordova,Phonegap Build,Fastlane,将Fastlane与phonegap应用程序构建集成的最简单方法是什么?在过去两年中,我们一直在使用phonegap手工构建应用程序,这可能是一个乏味的过程。现在,我们正在成长,需要开始能够重新发布应用程序,我们正在寻找一个快速/简单的解决方案,可以简化整个过程。我已经在Web和fastlane存储库中搜索过了,但没有看到太多关于与phonegap集成的内容。任何信息或资源都将不胜感激。我们自与Cordova合作(与Phonegap不完全相同,但距离足够近)成立以来一直在使用fastlane(从

将Fastlane与phonegap应用程序构建集成的最简单方法是什么?在过去两年中,我们一直在使用phonegap手工构建应用程序,这可能是一个乏味的过程。现在,我们正在成长,需要开始能够重新发布应用程序,我们正在寻找一个快速/简单的解决方案,可以简化整个过程。我已经在Web和fastlane存储库中搜索过了,但没有看到太多关于与phonegap集成的内容。任何信息或资源都将不胜感激。

我们自与Cordova合作(与Phonegap不完全相同,但距离足够近)成立以来一直在使用fastlane(从shezhen等迁移而来),并发现它非常节省时间。我认为主要的区别是使用phonegap构建服务,理论上可以通过fastlane调用,使用shell命令,尽管我建议在本地构建

我还建议将Fastlane与brew软件包一起安装。(假设您在Mac电脑上)

brew cask安装fastlane

在项目的根目录中运行:

fastlain init

这将设置一个主fastlane目录,您将从中管理Android和iOS

我们的目录结构如下所示:

fastlane_version "2.1.1"

default_platform :ios

app_name = "REDACTED"
app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)

platform :ios do

  lane :development_profiles do
    match(type: 'development', app_identifier: "#{app_identifier}")
    match(type: 'development', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :appstore_profiles do
    match(type: 'appstore', app_identifier: "#{app_identifier}")
    match(type: 'appstore', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :profiles do
    development_profiles
    appstore_profiles
  end

  lane :build_development do
    development_profiles
    gym(
      configuration: "Debug",
      output_name: "#{app_name}-development.ipa"
    )
  end

  lane :build_release do
    appstore_profiles
    gym(
      configuration: "Release",
      output_name: "#{app_name}-release.ipa"
    )
  end

  lane :hockeyapp do |options|
    hockey(
      ipa: "REDACTED",
      dsym: "REDACTED",
      api_token: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  lane :beta do
    build_release
    pilot
  end

  lane :release do
    deliver(
      ipa: "REDACTED",
      force: true,
      skip_metadata: true,
      skip_screenshots: true
    )
  end

  lane :screenshots do
    deliver(
      skip_binary_upload: true
    )
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

platform :android do

  lane :build_development do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildDebug",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-debug.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-debug.apk REDACTED/")
    end
  end

  lane :build_release do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildRelease",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-release.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-release.apk REDACTED/")
    end
  end

  lane :hockeyapp do |options|
    hockey(
      apk: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :release do |options|
    supply(
      track: options[:track],
      apk_paths: ["REDACTED", "REDACTED"],
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end
── 快车道
│   ├── 应用文件
│   ├── 投递文件
│   ├── 快速文件
│   ├── 健身档案
│   ├── 匹配文件
│   ├── 供应文件
│   └── 元数据

我们的fastfile如下所示:

fastlane_version "2.1.1"

default_platform :ios

app_name = "REDACTED"
app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)

platform :ios do

  lane :development_profiles do
    match(type: 'development', app_identifier: "#{app_identifier}")
    match(type: 'development', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :appstore_profiles do
    match(type: 'appstore', app_identifier: "#{app_identifier}")
    match(type: 'appstore', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :profiles do
    development_profiles
    appstore_profiles
  end

  lane :build_development do
    development_profiles
    gym(
      configuration: "Debug",
      output_name: "#{app_name}-development.ipa"
    )
  end

  lane :build_release do
    appstore_profiles
    gym(
      configuration: "Release",
      output_name: "#{app_name}-release.ipa"
    )
  end

  lane :hockeyapp do |options|
    hockey(
      ipa: "REDACTED",
      dsym: "REDACTED",
      api_token: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  lane :beta do
    build_release
    pilot
  end

  lane :release do
    deliver(
      ipa: "REDACTED",
      force: true,
      skip_metadata: true,
      skip_screenshots: true
    )
  end

  lane :screenshots do
    deliver(
      skip_binary_upload: true
    )
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

platform :android do

  lane :build_development do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildDebug",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-debug.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-debug.apk REDACTED/")
    end
  end

  lane :build_release do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildRelease",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-release.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-release.apk REDACTED/")
    end
  end

  lane :hockeyapp do |options|
    hockey(
      apk: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :release do |options|
    supply(
      track: options[:track],
      apk_paths: ["REDACTED", "REDACTED"],
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

关键是,您将项目视为一个普通的本地项目,并以这种方式构建它。效果很好

我们从一开始就使用fastlane(从shezhen等迁移而来)与Cordova(与Phonegap不太一样,但距离足够近),并且发现它非常节省时间。我认为主要的区别是使用phonegap构建服务,理论上可以通过fastlane调用,使用shell命令,尽管我建议在本地构建

我还建议将Fastlane与brew软件包一起安装。(假设您在Mac电脑上)

brew cask安装fastlane

在项目的根目录中运行:

fastlain init

这将设置一个主fastlane目录,您将从中管理Android和iOS

我们的目录结构如下所示:

fastlane_version "2.1.1"

default_platform :ios

app_name = "REDACTED"
app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)

platform :ios do

  lane :development_profiles do
    match(type: 'development', app_identifier: "#{app_identifier}")
    match(type: 'development', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :appstore_profiles do
    match(type: 'appstore', app_identifier: "#{app_identifier}")
    match(type: 'appstore', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :profiles do
    development_profiles
    appstore_profiles
  end

  lane :build_development do
    development_profiles
    gym(
      configuration: "Debug",
      output_name: "#{app_name}-development.ipa"
    )
  end

  lane :build_release do
    appstore_profiles
    gym(
      configuration: "Release",
      output_name: "#{app_name}-release.ipa"
    )
  end

  lane :hockeyapp do |options|
    hockey(
      ipa: "REDACTED",
      dsym: "REDACTED",
      api_token: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  lane :beta do
    build_release
    pilot
  end

  lane :release do
    deliver(
      ipa: "REDACTED",
      force: true,
      skip_metadata: true,
      skip_screenshots: true
    )
  end

  lane :screenshots do
    deliver(
      skip_binary_upload: true
    )
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

platform :android do

  lane :build_development do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildDebug",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-debug.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-debug.apk REDACTED/")
    end
  end

  lane :build_release do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildRelease",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-release.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-release.apk REDACTED/")
    end
  end

  lane :hockeyapp do |options|
    hockey(
      apk: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :release do |options|
    supply(
      track: options[:track],
      apk_paths: ["REDACTED", "REDACTED"],
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end
── 快车道
│   ├── 应用文件
│   ├── 投递文件
│   ├── 快速文件
│   ├── 健身档案
│   ├── 匹配文件
│   ├── 供应文件
│   └── 元数据

我们的fastfile如下所示:

fastlane_version "2.1.1"

default_platform :ios

app_name = "REDACTED"
app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)

platform :ios do

  lane :development_profiles do
    match(type: 'development', app_identifier: "#{app_identifier}")
    match(type: 'development', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :appstore_profiles do
    match(type: 'appstore', app_identifier: "#{app_identifier}")
    match(type: 'appstore', app_identifier: "#{app_identifier}.MessagesExtension")
  end

  lane :profiles do
    development_profiles
    appstore_profiles
  end

  lane :build_development do
    development_profiles
    gym(
      configuration: "Debug",
      output_name: "#{app_name}-development.ipa"
    )
  end

  lane :build_release do
    appstore_profiles
    gym(
      configuration: "Release",
      output_name: "#{app_name}-release.ipa"
    )
  end

  lane :hockeyapp do |options|
    hockey(
      ipa: "REDACTED",
      dsym: "REDACTED",
      api_token: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  lane :beta do
    build_release
    pilot
  end

  lane :release do
    deliver(
      ipa: "REDACTED",
      force: true,
      skip_metadata: true,
      skip_screenshots: true
    )
  end

  lane :screenshots do
    deliver(
      skip_binary_upload: true
    )
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

platform :android do

  lane :build_development do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildDebug",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-debug.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-debug.apk REDACTED/")
    end
  end

  lane :build_release do
    Dir.chdir ".." do
      sh("platforms/android/cordova/clean")
    end
    gradle(
      task: "cdvBuildRelease",
      project_dir: "platforms/android/",
      properties: {
        'android.useDeprecatedNdk' => true
      }
    )
    Dir.chdir ".." do
      sh("mkdir -p REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-armv7-release.apk REDACTED/")
      sh("cp -f platforms/android/build/outputs/apk/android-x86-release.apk REDACTED/")
    end
  end

  lane :hockeyapp do |options|
    hockey(
      apk: "REDACTED",
      notes: "Build " + (ENV["BUILD_NUMBER"] ? ENV["BUILD_NUMBER"] + " " : "") + "From " + git_branch + " branch on " + Time.now.strftime('%F') + " at " + Time.now.strftime('%T'),
      notify: "0"
    )
  end

  lane :release do |options|
    supply(
      track: options[:track],
      apk_paths: ["REDACTED", "REDACTED"],
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  lane :ci do
    build_development
    hockeyapp
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

关键是,您将项目视为一个普通的本地项目,并以这种方式构建它。效果很好

在根cordova目录中运行fastlane init时,我得到一个错误,说明如何在子目录中找到xcode项目,以及如何在子目录中运行fastlane init。我假设错误可以忽略?尽管返回了此错误,但确实创建了fastlane目录,但文件夹为空。在根cordova目录中运行fastlane init时,我收到一个错误,说明如何在子目录中找到xcode项目,以及如何在子目录中运行fastlane init。我假设错误可以忽略?尽管返回了此错误,但确实创建了fastlane目录,但文件夹为空。