目前有没有办法在快速通道操作中提取快速通道操作的输出?

Is there currently a way to extract the output of a fastlane action within the fastlane actions?

我正在使用第三方 fastlane 插件,它包含一个将显示我需要捕获的重要信息的操作,例如 link。

我试图找到一种优雅的方式来在快速通道操作中捕获这些日志,我试图避免使用 shell 命令,但如果这是唯一的方法,那么我想我别无选择。

我需要这个 link,因为它是独一无二的 运行dom link,其中包含我要下载的资源。

我尝试重定向 stdout 无济于事,因为 fastlane 使用他们自己的记录器(通常 UI.message)并且正要向 fastlane 提交功能请求但我想也许其他人已经 运行并设法通过它。

有没有办法重定向并捕获这种类型的日志?

这是UI周围的fastlane源代码:https://github.com/fastlane/fastlane/tree/master/fastlane_core/lib/fastlane_core/ui

这是我尝试重定向输出的方法之一: Capturing logger output inside a method

如有任何帮助/建议/资源,我们将不胜感激!

fastlane 的构建方式允许您将 UI 层替换为您自己的层。您可以在 fastlane.ci GitHub 存储库 https://github.com/fastlane/ci/blob/master/app/features/build_runner/fastlane_build_runner_helpers/fastlane_ci_output.rb

上找到示例实现

您接下来的设置方式如下

ci_output = FastlaneCI::FastlaneCIOutput.new(
  each_line_block: proc do |raw_row|
    puts "new line here, access raw_row"
  end
)

FastlaneCore::UI.ui_object = ci_output

我不知道这是否对你有帮助,但我设法将 fastlane stdout 捕获到一个变量以获得我想要的东西(在我的例子中是获得 iPhone 开发证书的通用名称)使用这个简单的方法

def with_captured_stdout
  original_stdout = $stdout
  $stdout = StringIO.new
  yield
  $stdout.string
ensure
  $stdout = original_stdout
end

lane :test do |options|
  match_dev = with_captured_stdout { match(type: 'development') }
  puts match_dev
  @dev_index = match_dev.index('iPhone Developer')
  ENV['DEV_CODE_SIGN_ID'] = match_dev[@dev_index..match_dev.index(')', @dev_index)]
  # ENV['DEV_CODE_SIGN_ID'] = "iPhone Developer: Test Name (XXXXXXXX)"
end

来自

忘记更新了,不过最后我是这样解决的:

module Fastlane
  module Helper
    class UtilHelper
      # Redirects standard output and standard error to a file
      # (currently only way we know how to capture fastlane ui messages)
      def self.redirect_stdout_to_file(filename)
        original_stdout = $stdout.clone
        original_stderr = $stderr.clone
        $stderr.reopen File.new(filename, 'w')
        $stdout.reopen File.new(filename, 'w')
        yield
      ensure
        $stdout.reopen original_stdout
        $stderr.reopen original_stderr
      end

    end
  end
end

我是这样使用它的:

temp_file = 'testlab.log'
UtilHelper.redirect_stdout_to_file(temp_file) { upload_xctestrun() }

upload_xctrestrun 做什么是无关紧要的,只要知道它是 fastlane 插件的一个函数,它使用 fastlane UI 对象输出消息,如下所示:

UI.message("Some fastlane decorated message here")

希望这对任何人都有帮助:)

我不确定这是否正是 OP 想要的答案,但似乎确实有一种方法可以将操作结果作为 json 字符串。我在这里添加这个是因为我在搜索我的问题时发现了这个问题,并且在 fastlane 文档中并不明显,这是可能的。

在我的 Fastlane 文件中,我使用了这些操作:

  packageName = "com.example.mine"

  versionName = google_play_track_release_names(
    package_name: packageName,
    track: "production"
  )

  versionCode = google_play_track_version_codes(
    package_name: packageName,
    track: "production"
  )

  UI.message "Package Info: #{packageName}, #{versionName} #{versionCode}"

输出看起来像这样

Package Info: com.example.mine, ["4.2.0"] [2027]

我还抑制了所有屏幕输出,方法是通过 grep 管道命令获取我想要的行。 (我也找不到执行此操作的参数或选项。)

fastlane android get_version | grep "Package Info

希望这对像我这样的新手有所帮助!