2017-06-14 45 views
0

我試圖用Fastlane與當前配置部署我的iOS應用程序:具有多個目標和多個環境的單個項目(使用.xccconfig文件)。我創建了3條車道:開發,測試版,發行版。這些車道採用「brand_name」作爲參數,因此我可以爲每個目標使用相同的車道。如何讀取.xcconfig文件常量與紅寶石使用它們作爲Fastlane車道變量?

我想要實現的是「讀取」目標的.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 

謝謝

回答

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 
0

我一直工作在一個類似的任務,並已發現瑟的解決方案ems工作。回答您的問題,我們可以打開.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