Anyone have any resources on understanding .pbxproj files? - xcode

I'm trying to wrap my head around why the .pbxproj file changes as soon as I open Xcode.

project.pbxproj is an important file in the Xcode configuration bundle. It is responsible for maintaining references to all of the linked files and their groupings, linked frameworks, and most importantly, the project’s build settings.
You should track the pbxproj file changes in your version control, if you found something wierd changes that happen when you open the project everytime, you'd better show the changes, eg. git diff <path-to-pbxproj>.
References: Xcode and git: bridging the gap

Related

xcodeproj file has disappeared?

All the .h and .m files are in the folder for a particular app I'm working on, but the xcodeproj file is missing, even though I worked on it less than a week ago. Looking in the Finder doesn't bring it up (though it brings up lots of OTHER xcodeproj files).
I've looked for answers to this question but I'm not understanding what I've found so I can't tell whether it helps.
I'm sure it's something completely obvious, especially as I'm very new to source control and git. Can anybody help me out?
It is possible that you are looking in the wrong folder for the xcodeproj, or that it is not currently on your system and you have to retrieve it from the repository.
Perhaps you are viewing a folder that's one level down from where the xcodeproj file is. Move up the filesystem hierarchy and see if you find the file. If you're not concerned where the file is on your system and you just want to open it in Xcode, use Xcode's File > Open Recent menu item.
If those attempts fail, you may have to check out the missing file:
How do I pull a missing file back into my branch?

Force Xcode to update project files

OK, here's my issue :
I'm using Xcode 4.6 under Lion
In my current project I've added several "real" folders (either with sources or with resources) which Xcode represents as "Groups"
However, whenever I add another file in one of my already-imported folders, the file doesn't show up (but instead I have to manually drag each new file to its appropriate location).
Well, given that my project is comprised of hundreds of different files, and that files are being added constantly, this seems like an overkill.
I realize this may have to do with Xcode's Group-centric approach, but it still bothers me.
So, is there any workaround? Any ideas?
As for many IDE, it won't scan changes of new files in included folder, to prevent accidental add of extra codes that will break the compile process. If you really want to do so, write a script to add all files in the folder and run it at pre-compile stage, i.e. in Xcode, "External Target"
See: https://stackoverflow.com/a/976459/188331

Using downloaded sample projects with a missing .xcodeproj

I'm trying to learn Obj-C but when I download sample projects, the .xcodeproj file seems to be missing on all the examples I download. Not quite sure why, but I'm stuck. A few questions (which overlap):
How do I open these projects to run them if the .xcodeproj file is missing?
How do I turn these downloaded examples into projects I can use?
Is there some fundamental reason why it seems to be standard practice NOT to include the .xcodeproj file?
It's not possible to open a project without an .xcodeproj. This directory contains several compulsory infos like :
list of files, resources of the project,
compilation options,
etc.
Where are you getting these samples from? Is it possible that xcodeproj files are hidden on your filesystem? If there really isn't an .xcodeproj file, then it's not too hard to make your own and drag in the source files.
I had the same issue when using git command lines to clone repositories.
However, if you use XCode's integrated source control features to work with existing projects you can open the project and you will find the xcodeproj in your source code directory.
To do this, launch XCode, choose "Connect to repository", specify the location (for example: https://github.com/insurgentgames/Alphabet-Blocks.git), hit 'Clone', then Open Project.

Is there a way to reconstruct an Xcode project file?

If the current Xcode project files (all inside the ProjectName.xcodeproj folder) are missing after a crash, is there a way to reconstruct it if not relying on git? (the project file is not committed all the time).
There is not enough redundant information elsewhere to completely reconstruct an xcodeproj file, but you can start by making a new one and dragging the source code into it.

Can Xcode Use "Folder References" for Code?

Like many people, I would love to have Xcode use a folder structure that mirrors the folder-structure on disk. However, I cannot get the code in "folder references" (the cyan folders) to show up in my project targets under "Compile Sources." Is there any way to do this?
I have managed to even add a cyan folder to the "Compile Sources" build phase, but that does not result in the contents of that folder being added.
How can I use folder references for code?
The simple (and very unfortunate) answer is that Folder References under Xcode remain broken and buggy, they don't work. Tested 04-Mar-2017 in Xcode 8.2.1
Below is an example exploration so you do not have to waste your time replicating the Xcode failure.
(incidentally buggy Xcode crashed twice while I was producing this example)
Per the question, the overall desire is to use a folder reference in Xcode so Xcode picks up all the files in the folder and includes them in the project, and by proxy will update automatically based upon any Finder or Xcode changes of the folder. In this way 50 projects all leveraging the same set of common source code files do not have to be individually updated when those folders get changed. Below explores how this is broken in Xcode (tested in 8.2.1)
The example: ViewController.m includes NSError+Core.h so we want everything from the folder "NSError+Core" to be added to the project.
NSError+Core.h is in this centrally located development folder
Drag the source folder from the Finder into the Project under the "Support" group (nothing up my sleeves, simple drag)
Xcode dutifully offers to add the drag to the target, note the "Create folder references" is selected, not "Create group references". Note also it is clear that Xcode is offering and is told to add this folder and files to the targets.
Although everything looks like it should work, the compiler does not pick up the header file and a recompile yields the same results... can't find header. Ditching the DerivedData does not help either.
So doing a double check, we check the "Compile Sources" under the project and sure enough, the source file is not there either. Remember, Xcode 'added' it to the target...
So what if we drag it from the folder into the "Support" group...
It offers to add them to the project again?! Note that the settings are identical to the first time they were drug in by virtue of the parent folder drag instead of files...
And now the source file shows up in the "Compile Sources" list. Note the bizarre double listing of the files in the project.
(Xcode crashed shortly after snapping this screen shot)
And of course the compiler can now find the header file and the error clears on the import as it should have the first time we drug it in...
Did it just need a little help to "find" the file? If so, the "Create folder references" does exactly what?
So we try and tidy up and drag the files back from the parent "Supporting Files" group to their rightful folder. Without any confirmation, indication, notification, the files just vanish from the group and nothing happens in the NSError+Core folder.
Oh by the way, it really did delete them from the project too... The Compile Sources no longer has the NSError+Core.m reference.
SO to sum up, "Folder references" as implemented thus far do not seem to have any useful purpose... It would appear to be a 6+ year old dunsel on the USS Xcode.
Kevin - linked source folders, folder references, etc, are super useful for when you have a common code base shared across different IDEs, like I do for my games that I compile on Windows, Mac, iOS, Android, Linux, etc. I have 3 different IDEs all building the same shared codebase, so it's very helpful when one automatically picks up on a new file and adds it right into the project after I merely run svn update, and I svn commit from one IDE (say XCode) and my Eclipse in Windows project picks up the change. I have a different project for each because each IDE likes the project files in a certain configuration so it's easier for me to have multiple SVN directories (base-project, project-ios, project-android) that all share code in base-project than to have one mega project directory with the different IDE bits unhappily all shoved into subdirectories (which is what I tried the first time around).
Furthermore - it used to work fine in XCode 3. They seemed to not like that useful of a feature so it is no longer working in XCode 4 as I've just found out.
I just tried doing this to share code across multiple Xcode projects, and our team came to the conclusion that it's better to create an Xcode project that contains all of your shared classes, compiles them into a static/dynamic library, and then add that as a subproject to those that need the shared code. Then you can set up target dependencies and link your shared library. This will get you the "automatic updating" every time you add a new class to the shared library project.
This approach also works well with submodules or even cocoapods/carthage.
You can't. Why are you even trying? A folder reference's job is to embody a folder, without having entries for all the individual files in the folder. It's primary use is for copying an entire folder of resources verbatim into a project. If you want to compile the sources though, then those sources must be referenced in the Compile Sources build phase of the target, which requires having individual entries for each file.
Depending on what's in the folder, it might make more sense to have a Makefile or some other external build process that builds the content in the folder into a static library. This way you can invoke that build process from a Shell Script Phase, and then just link in the resulting static library. Alternatively if you're using this folder as a way to have a shared bit of code (e.g. an svn:externals or git submodule), you could give that folder its own Xcode project and then embed that project into any of your other projects which share this folder.

Resources