5

我正在尝试使用当前配置的 Fastlane 部署我的 iOS 应用程序:具有多个目标和多个环境的单个项目(使用 .xccconfig 文件)。我创建了 3 个通道:开发、测试、分发。这些车道采用“brand_name”作为参数,因此我可以为每个目标使用相同的车道。

我想要实现的是“读取”目标的 .xcconfig 文件(例如PRODUCT_BUNDLE_IDENTIFIER)中的常量并将其用作我的通道中的变量。我设法通过创建和读取包含目标捆绑 ID 的 yaml 文件来做到这一点,但由于我已经在使用 .xcconfig 文件,所以我想避免重复。我做了一些搜索以找到答案,但由于我对 ruby​​ 还很陌生,所以我现在被困住了。请问有没有办法做到这一点?

如果有帮助,这是我目前正在使用的一个工作通道,其中包含我想要使用 .xcconfig 文件而不是 yaml 文件替换的部分的注释:

lane :development do |options|

    # Getting lane settings

    #adding lane_name to the options
    options = options.merge(lane_name: 'development') 

    # THIS IS THE PART I'D LIKE TO REPLACE WITH .XCCONFIG FILE INSTEAD OF YAML
    #fastlane config path
    config = YAML.load_file(File.join(File.dirname(__FILE__),"../Brand", options[:brand_name],"Configs/fastlane_config.yaml"))
    settings = OpenStruct.new(config)
    lane_settings = settings[options[:lane_name]]

    # Settings the App Identifier
    app_identifier = lane_settings["bundle_identifier"]

    pilot(skip_submission: true)
end

谢谢

4

2 回答 2

5

我一直在从事类似的任务,并找到了一个似乎可行的解决方案。回答您的问题,我们可以打开 .xcconfig 文件并按键读取一个值。

lane :development do |options|
    fastlane_require 'Xcodeproj'

    # Compose .xcconfig file path
    configuration_file = "../Brand" + options[:brand_name] + "Configs/config.xcconfig"

    # Read values from the .xcconfig file
    configuration = Xcodeproj::Config.new(configuration_file)
    app_identifier = configuration.attributes['PRODUCT_BUNDLE_IDENTIFIER']

    ... 
end

但我发现它是一个非常肮脏的解决方案,因为仍然存在一些重复:我们在 Xcode 项目中为目标/配置指定了一个配置文件,现在我们再次手动指定它。

一旦我们开始相互“继承”(包含)配置文件,就会出现更多问题。如果您有很多构建配置并且它们中的大多数共享相同的设置,但只有一些设置在配置之间有所不同,它会很有用。

实现您最可能需要的正确方法是通过合并所有适用的源来获取标志值:项目、目标、配置、配置文件。这可以通过从您的配置中获取构建设置来完成,而不是从 .xcconfig 本身。

lane :development do |options|
    fastlane_require 'Xcodeproj'


    # Here we can define some hardcoded values,
    # or read them from lane options,
    # or read them from environment variables...
    project_name = '../XXX.xcodeproj'
    target_name = 'YYY'
    configuration_name = 'ZZZ'

    # Read values from the configuration,
    # specified in project settings for a specific target.
    project = Xcodeproj::Project.open(project_name)
    target = project.native_targets.find {|s| s.name == target_name }
    configuration = target.build_configurations.find {|s| s.name == configuration_name}
    app_identifier = configuration.resolve_build_setting('PRODUCT_BUNDLE_IDENTIFIER')

    ...

end
于 2017-12-12T08:50:24.260 回答
0

直接打开 Xcode 项目并循环遍历目标/配置以找到正确的项目怎么样:

lane :development do |options|

    # Getting lane settings

    #adding lane_name to the options
    options = options.merge(lane_name: 'development')

    project = '../PATH_TO_XCODE_PROJ'
    target = 'TARGET'
    buildConfiguration = 'BUILD_CONFIGURATION'
    app_identifier = ''

    project = Xcodeproj::Project.open(project)
    project.targets.each do |mtarget|
        if mtarget.name == target
            mtarget.build_configurations.each do |mbuild|
                if mbuild.name == buildConfiguration
                    app_identifier = mbuild.build_settings['PRODUCT_BUNDLE_IDENTIFIER']
                end
            end
        end
    end

    pilot(skip_submission: true)
end
于 2017-06-16T08:43:46.997 回答