Is it possible to sort the Compile Sources list in the Build Phases section of an Xcode project?

前端 未结 5 1113
梦如初夏
梦如初夏 2021-02-02 11:04

I want to sort the files in the \'Compile Sources\' section of my Xcode project according to their names. Is it possible?

相关标签:
5条回答
  • 2021-02-02 11:41

    Yes, you can reorder the Compile Sources section in Xcode, but not from the GUI - which is a shame considering that this is already version 6 of the IDE and they still haven't gotten around to this basic feature.

    As A-Live said, you need to edit the project.pbxproj file within the yourproject.xcodeproj file. Use Finder to select the yourproject.xcodeproj file and then use the context menu to Show Package Contents. After that open the project.pbxproj file with a text editor.

    Find the PBXSourcesBuildPhase section and copy everything between files = ( and ); into a new text file. Remove the leading tabs/spaces. Save that file somewhere on your disk. Open up a terminal and do this:

     sort -bf -t " " -k 3 PBXSourcesBuildPhase.txt > PBXSourcesBuildPhase.sorted.txt
    

    Open up the new PBXSourcesBuildPhase.sorted.txt file in your text editor, copy the sorted lines into the PBXSourcesBuildPhase section of your project.pbxproj (overwrite the lines that you previously copied) and save.

    Now you should be able to see all the files sorted in the Compile Sources section in Xcode.

    I've tested this in Xcode 6.0.1 with a small project (~150 source files) and had no problems.

    Careful: you should make a backup of your project file (or better: use version control) before you try this. Just in case.

    0 讨论(0)
  • 2021-02-02 11:44

    This is thoroughly answered, but I thought I'd share the Emacs command that sorted these in place for me. Navigate to project.pbxproj, mark all files under PBXSourcesBuildPhase, and use the command:

    M-3 M-x sort-fields

    ...aka sorting the marked area by the 3rd column, which happens to be the filenames. C-x C-s and you're on your way.

    0 讨论(0)
  • 2021-02-02 11:47

    I reckon it is a shame that this is not possible.

    as a workaround in most of situations, you can use the search filter on the right upper corner of the file list.

    for example, I needed to add a compiler flag in many files which (fortunately) all started with the same prefix. to do so, as stated here, you have to double click on a file.

    then, I filtered the files for the prefix, shift-clicked them in order to select them all, then released shift and double-clicked one of them. this way I was able to add the flag to all of the files at once

    0 讨论(0)
  • 2021-02-02 11:55

    The accepted solution works fine, but it requires manual steps(open the project file, find the section for the target that you want etc.) so it is a little cumbersome and it can not be automated if you need to keep the section sorted each time you perform a build or commit. I faced with the same problem and I created a ruby script to sort these sections. The script sorts the 'Compile Sources', 'Copy Bundle Resources’ and all the 'Copy files' sections under Build Phase for a specified or all the targets.

    #!/usr/bin/env ruby
    require 'xcodeproj'
    require 'set'
    
    project_file, target_name = ARGV
    
    # open the project
    project = Xcodeproj::Project.open(project_file)
    
    # find the target
    targets_to_sort = project.native_targets.select { |x| x.name == target_name || target_name.nil? }
    
    phases_to_sort = [Xcodeproj::Project::Object::PBXSourcesBuildPhase, Xcodeproj::Project::Object::PBXCopyFilesBuildPhase, Xcodeproj::Project::Object::PBXResourcesBuildPhase]
    
    targets_to_sort.each do |target|
      puts "sorting files for target #{target.name}"
      phases_to_sort.each do |phase_to_sort|
        target.build_phases.select { |x| x.class == phase_to_sort }.each do |phase|
          phase.files.sort! { |l, r| l.display_name <=> r.display_name }
        end
      end
    end
    
    puts 'saving project'
    project.save
    

    To sort all targets:

    ./sort_sources.rb MyProject.xcodeproj
    

    Or to sort only one target:

    ./sort_sources.rb MyProject.xcodeproj My_Target
    

    It requires the gem xcodeproj:

    gem install xcodeproj
    
    0 讨论(0)
  • 2021-02-02 11:57

    You can reorder the entries of PBXSourcesBuildPhase section at the project.pbxproj, it worked for me but of course there's no guarantee in general for it to work. Don't forget to backup your backups first.

    0 讨论(0)
提交回复
热议问题