我如何指定要使用 Fastlane 更新的应用程序(在 Google Play 控制台中创建)?

How can i specify the app (created in the Google Play Console) i want to update using Fastlane?

我目前正在尝试在“Fastlane”的帮助下设置持续集成。 该项目已准备好构建并上传到 Google Play 商店。如果我手动执行此操作,一切正常。

我们希望在 Google Play 中拥有三个不同的 App(具有三个不同的标识符 [com.myapp、com.myapp.int、com.myapp.rc])。其中只有一个 public。其背后的原因是能够在一台设备上安装每个环境以进行测试。这当然不是实现这一目标的最优雅的方式。但我相信这是 并且可能并非没有原因。

所以我能够为不同的环境构建应用程序。我目前面临的问题是,如果我想使用 Fastlane 上传它们,我只能上传标识符为 com.myapp 的,其他的会收到以下错误消息:

[10:57:14]: fastlane finished with errors
[!] Google Api Error: forbidden: APK has the wrong package name. - APK has the wrong package name.

这听起来很合理,因为我从未指定要更新哪个应用程序。如果我手动上传 AAB,我会导航到“Google Play Console”内的正确应用程序并将其上传到那里,但似乎 Fastlane 中不存在此选项(这会很奇怪)。 奇怪的是,只有其中一个有效,因为我什至无法选择哪个应该有效。 Google/Fastlane 如何选择我要更新的应用程序?

首先,我认为该应用程序会在 json 键内指定,以便 google 播放。但是我在这个 medium post 中读到它在不同的项目中是相同的。

这是我的 Fastfile:

default_platform(:android)

platform :android do
  desc "Runs all the tests"
  lane :test do
    gradle(task: "test")
  end

  desc "Submit a new Beta Build to Play Store"
  lane :beta do
    sh("cp", "../../.env.integration", "../../.env")
    gradle(task: 'clean')
    gradle(
      task: 'bundle',
      build_type: 'Release',
      print_command: false,
    )
    upload_to_play_store(
      track: 'internal'
    )
  end
end

这是我的应用程序文件:

json_key_file("~/.private_keys/google_api_key.json")
package_name("com.myapp")


for_platform :android do
  for_lane :beta do
    package_name("com.myapp.int")
  end
end

根据documentation,您可以通过apkaab参数指定APK或AAB的路径。

在您的示例中,您应该能够像这样上传特定的 android 应用程序包(将 PATH_TO_AAB.aab 替换为文件的实际相对或绝对路径):

upload_to_play_store(
  track: 'internal',
  aab: 'PATH_TO_AAB.aab'
)

备选

或者,您可以为您拥有的三个应用程序版本创建三个不同的通道。

然后在每个通道中,您可以指定必须在 gradle 任务中构建哪种风格。

例如,如果您的某个口味/版本名为“pro”,您可以将 gradle 命令中的 build_type 设置为 ProRelease 而不是 Release.这样,只构建特定风味的发布版本。

desc "Submit a new Beta Build to Play Store"
  lane :beta do
    releaseFilePath = File.join(Dir.pwd, "..", "keystores","my-release-key.keystore")
    gradle(task: 'clean')
    gradle(
      task: 'bundle',
      build_type: 'ProRelease',
      print_command: false,
    )
    upload_to_play_store(
      track: 'internal'
    )
  end

您在 Appfile 中调用的 package_name() 函数将指定 Google Play fastlane 中的哪个 App 应该尝试更新。

但是它不能确定 applicationId 哪个 gradle 用于构建应用程序,因此您必须确保这两个值匹配。

我们是这样解决的:

    lane :build_lane do
        slack(message: "Starting build for myapp", default_payloads:[])
        build_android kFlavour:"myapp1" , kPackage_name:"com.abc.def"
    end

有了这一部分:

    lane :build_android do | options |
        sh("flutter", "build", "appbundle", "--flavor", options[:kFlavour], "--no-sound-null-safety")
        slack(message: "Uploading " + options[:kFlavour] + " to playstore", default_payloads:[])
        upload_to_play_store(
            track: 'internal',
            track_promote_to:'alpha',
            version_code: flutter_version()["version_code"],
            version_name: flutter_version()["version_name"] + '+' + flutter_version()["version_code"],
            aab: "../build/app/outputs/bundle/"+options[:kFlavour]+"Release/app-" + options[:kFlavour] + "-release.aab",
            skip_upload_changelogs: true,
            skip_upload_screenshots: true,
            skip_upload_images: true,
            package_name: options[:kPackage_name],
        )
        slack(message: options[:kFlavour] + " successfully released on Android!", default_payloads:[])
    end

我们在 upload_to_play_store()

中添加了 package_name 行