目前是否有一种方法可以在fastlane动作内提取fastlane动作的输出?

6
我正在使用第三方的fastlane插件,其中包含一个动作,将显示我需要捕获的重要信息,例如链接。
我正在尝试找到一种优雅的方式来在fastlane的动作中捕获这些日志,我试图避免使用shell命令,但如果这是唯一的方法,那么我想我别无选择。
我需要这个链接,因为它是一个包含我想要下载的资源的独特和随机的链接。
我已经尝试重定向stdout,但没有成功,因为fastlane使用他们自己的记录器(通常是UI.message),并且即将提交一个功能请求到fastlane,但认为也许有人遇到了这个问题,并设法解决了它。
有没有办法重定向这种类型的日志并捕获它?
这里是UI周围的fastlane源代码:https://github.com/fastlane/fastlane/tree/master/fastlane_core/lib/fastlane_core/ui 以下是我尝试重定向输出的其中一种方式:在方法内捕获记录器输出 任何帮助/建议/资源都将不胜感激!
4个回答

6

我不确定这是否正好是原始问题所需要的答案,但似乎有一种方法可以将操作的结果作为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

希望这篇文章能够帮助像我一样的初学者!


非常感谢您的回答!这比我最初打算写入文件要好得多。非常感激。 - dev2505

3

我忘记更新这个了,但最终我是这样解决的:

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() }
< p > upload_xctrestrun 的作用并不重要,只需要知道它是来自 fastlane 插件的一个函数,使用 fastlane UI 对象输出消息,如下所示:

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

希望这能帮到任何人 :)

2

我不知道这是否能帮到你,但是我成功地将fastlane的标准输出捕获到了一个变量中,以获取我想要的内容(在我的情况下是获取iPhone开发证书的通用名称),使用了以下简单方法:

variable = `fastlane command here`

其中command here是你想要执行的fastlane命令。

希望对你有所帮助。

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

来自https://dev59.com/v2Up5IYBdhLWcg3w3aZ1#22777806的最初回答:


1

我有点明白你的意思,但我并不是直接尝试访问UI.messages的结果,我想要获取使用它们的操作的输出,比如扫描。类似这样: output = scan(arg: 'value') - nanci.drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接