2017-06-14 1 views
0

Ich versuche, meine iOS-Apps mit Fastlane mit der aktuellen Konfiguration zu implementieren: ein einzelnes Projekt mit mehreren Zielen und mehreren Umgebungen (mit .xccconfig-Dateien). Ich habe 3 Spuren erstellt: Entwicklung, Beta, Distribution. These Gassen nimmt einen "brand_name" als Parameter, also kann ich die selbe Spur für jedes Ziele benutzen.Wie liest man .xcconfig-Dateikonstanten mit Ruby, um sie als Fastlane-Lane-Variablen zu verwenden?

Was ich versuche zu erreichen ist, die Konstanten in der .xcconfig-Datei des Zieles zu "lesen" (z. B. PRODUCT_BUNDLE_IDENTIFIER) und es als eine Variable in meiner Spur zu verwenden. Ich habe es geschafft, indem ich eine yaml-Datei mit der Bundle-ID des Ziels erstellt und gelesen habe, aber da ich bereits .xcconfig-Dateien verwende, möchte ich Doppelungen vermeiden. Ich habe ein wenig gesucht, um eine Antwort zu finden, aber da ich Ruby ziemlich neu bin, stecke ich gerade fest. Gibt es einen Weg dies zu erreichen?

Wenn es hilft, ist hier eine Arbeits Spur ich zur Zeit auf dem Teil mit einem Kommentar mit I anstelle einer YAML-Datei mit einer .xcconfig Datei ersetzen möchten:

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 

Danke

Antwort

0

Was direkt öffnen Xcode-Projekt und Schleife durch Ziele/Konfigurationen finden die richtige:

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

ich habe auf einer ähnlichen Aufgabe gearbeitet und haben eine Lösung gefunden, die se ems zu arbeiten. Auf Ihre Frage können wir die .xcconfig-Datei öffnen und einen Wert nach Schlüssel lesen.

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 

Aber ich finde es als eine ziemlich schmutzige Lösung, da es noch einige Vervielfältigung ist: wir eine Konfigurationsdatei für die Ziel/Konfiguration in der Xcode-Projekt festgelegt haben, und jetzt haben wir wieder manuell angeben.

Es gibt noch mehr Probleme, sobald wir anfangen, Konfigurationsdateien voneinander zu "erben". Es kann nützlich sein, wenn Sie viele Build-Konfigurationen haben und die meisten von ihnen die gleichen Einstellungen haben, aber nur einige Einstellungen unterscheiden sich über die Konfigurationen.

Der richtige Weg, um das zu erreichen, was Sie am wahrscheinlichsten brauchen, ist den Flag-Wert zu erhalten, indem Sie alle anwendbaren Quellen zusammenführen: Projekt, Ziel, Konfiguration, Konfigurationsdateien. Dies können Sie tun, indem Sie Build-Einstellungen von Ihrer Konfiguration, nicht von der .xcconfig selbst abrufen.

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 
Verwandte Themen