Xcode projects on steroids

Overview

Struct logo

Struct

Latest Gem Release Git Version Git Version Build status Coverage Status Help Contribute to Open Source

Introduction

struct is a tool for iOS and Mac developers to automate the creation and management of Xcode projects.

Ever lamented over your unorganised project files? struct solves that by making your filesystem be your project structure. How it is on disk is how it is in your project. Simple.

Need to have multiple variants of a project depending on how you're distributing to your customers? struct's got you covered with target variants. Now you get a project for each variant, with the ability to add additional source files and resources. Great for whitelabelling and multiple distribution channels!

struct makes working with Xcode easy. You get simple, predictable project files that any developer can understand. Just treat your Xcode projects as a build artifact and feel the weight lift off your shoulders.

Use a spec file to define your project:

---
version: 3.0.0
configurations:
  debug:
  release:
targets:
  MyApp:
    sources: src
    i18n-resources: res
    platform: ios
    type: ":application"
    configuration:
      ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
      INFOPLIST_FILE: Info.plist
      PRODUCT_BUNDLE_IDENTIFIER: uk.lyptt.MyApp

Then just run struct generate and struct will do the rest.

You can find documented examples of the project specification in the examples folder.

Installation

struct requires a minimum of Ruby 2.6.3, which is available in macOS Catalina. You can install a higher version of Ruby with RVM on an older macOS version.

Install struct from Rubygems:

You may need to use sudo when using the system-provided Ruby

$ gem install struct

Quick Start

Get started with adding struct to your app:

Create your first spec file

Available Commands

To generate an Xcode project from your spec file, run the following from your project directory:

$ struct generate

To start the file watcher, run the following from your project directory:

$ struct watch

The project will be automatically regenerated whenever the project or any source files change.

Other commands can be discovered by viewing help:

$ struct help

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/lyptt/struct.

Comments
  • v.1.2 does not work

    v.1.2 does not work

    Installed the new release and tried to run struct --generate with a Specfile presented in the folder. Got this message: wrong number of arguments (0 for 1). Not sure what does it mean. Any ideas?

    help wanted 
    opened by maximkhatskevich 30
  • Xcode crashes when trying to open project file

    Xcode crashes when trying to open project file

    I use Ruby 2.4.0 via RVM. With latest Struct. I prepared YAML spec file and generated project file. Operation went normally, no even warnings nor errors. But when I'm trying to open the project file (double click or add to workspace) - Xcode crashes. Any ideas how to fix? Thanks!

    The spec file: https://www.dropbox.com/s/or9bram5jujxgxs/project.yml?dl=0 The generated project file: https://www.dropbox.com/sh/r9xfkazxwudzi8t/AABkjXLyaLUQS6PepoQtnOy6a?dl=0 The Xcode crash details: https://www.dropbox.com/s/7yzy53psvyvlho2/XcodeCrash.txt?dl=0

    help wanted 
    opened by maximkhatskevich 18
  • Version 1.0

    Version 1.0

    Xcodegen's being used by more people every day, this PR will achieve a few objectives in making this tool have a great 1.0 release:

    • [x] Full test coverage accounting for bad data, and all user workflows
    • [x] Rubocop integration to keep code styles consistent
    • [x] A name change, better examples and more thorough documentation to give users new and old more confidence in its capabilities
    • [x] Automated tests for all PRs
    • [x] A better readme that illustrates all of the different workflows and use cases for this tool
    • [x] Full support for Spec 1.1.0
      • [x] Variants should support Run Scripts
      • [x] Create commands should target 1.1.0
      • [x] Migrate command should target 1.1.0
    opened by lyptt 17
  • Target configuration and configurations

    Target configuration and configurations

    New Issue Checklist

    • [x] Updated struct to the latest version
    • [x] I have read the documentation to make sure my issue isn't covered already

    Struct version

    [2.1.1]

    Spec version

    [2.1.1]

    Which type of spec are you using?

    • [x] project.yml
    • [ ] project.json
    • [ ] Specfile

    Context

    When specifying a target it's not possible to have both configuration and configurations. Both should be able to be set for the same target.

    Reproduction steps

    iOS:
        sources: iOS
        platform: ios
        type: ":application"
        configuration:
          INFOPLIST_FILE: iOS/Info.plist
        configurations:
          debug: iOS/configurations/test_debug_iOS.xcconfig
          staging debug: iOS/configurations/staging_debug_iOS.xcconfig
          production debug: iOS/configurations/production_debug_iOS.xcconfig
          test release: iOS/configurations/test_release_iOS.xcconfig
          staging release: iOS/configurations/staging_release_iOS.xcconfig
          production release: iOS/configurations/production_release_iOS.xcconfig
        references:
    

    Expected result

    Target gets INFOPLIST_FILE set and also has project configurations set

    Actual result

    Only the project configurations are set. If the configurations is removed, INFOPLIST_FILE gets set correctly

    feature request 
    opened by yonaskolb 16
  • Merge Xcake into this

    Merge Xcake into this

    Hey so I've been working on something similar for the last year and I think rather than us competing it would be great for maybe my project to merge some of its features into this one.

    😀 It already has things like the DSL you would like so it would be interesting to see where we can collaborate

    Here is the link to my repo https://github.com/jcampbell05/xcake

    opened by jcampbell05 16
  • Wrong target naming when 'PRODUCT_NAME' setting is presented

    Wrong target naming when 'PRODUCT_NAME' setting is presented

    New Issue Checklist

    • [x ] Updated struct to the latest version
    • [ x] I have read the documentation to make sure my issue isn't covered already

    Struct version

    3.1.2

    Spec version

    2.1.0

    Which type of spec are you using?

    • [ x] project.yml
    • [ ] project.json
    • [ ] Specfile

    Context

    When target has 'PRODUCT_NAME' build setting set to a custom value (different from target name), then this value is used as target name, which is UNEXPECTED/NON-OBVIOUS behaviour.

    Reproduction steps

    Create simple project spec, add there "MyTarget" target, in configurations add "PRODUCT_NAME" setting equal to "XYZMyTarget". Run "struct generate" and in the resulting project...

    Expected result

    ...it should be named "MyTarget",...

    Actual result

    ... but, instead, the target will be named "XYZMyTarget".

    bug 
    opened by maximkhatskevich 15
  • Cross platform product name issue

    Cross platform product name issue

    New Issue Checklist

    • [x] Updated struct to the latest version
    • [x] I have read the documentation to make sure my issue isn't covered already

    Struct version

    [2.2.0]

    Spec version

    [2.2.0]

    Which type of spec are you using?

    • [x] project.yml
    • [ ] project.json
    • [ ] Specfile

    Context

    When defining multiple targets for a cross platform framework, a common PRODUCT_NAME is used, so that importing of the framework doesn't need to specify the specific target ie import MyFramework instead of import MyFramework-ios. This is especially important in cross platform frameworks which import other cross platform frameworks. When PRODUCT_NAME is specified however, target framework linking breaks

    Reproduction steps

    Given the following spec

    version: 2.2.0
    configurations:
      debug:
        type: debug
      release:
        type: release
    targets:
      MyApp:
        sources: AppSource
        platform: ios
        type: ":application"
        references:
          - target: MyFramework_iOS
            copy: true
            codeSignOnCopy: true
      MyFramework_iOS:
        sources: FrameworkSource
        platform: ios
        type: ":framework"
        configuration:
          PRODUCT_NAME: MyFramework
      MyFramework_tvOS:
        sources: FrameworkSource
        platform: tv
        type: ":framework"
        configuration:
          PRODUCT_NAME: MyFramework
    
    

    Expected result

    MyApp target correctly links to MyFramework_iOS and builds

    Actual result

    MyApp generates a broken framework linkage and encounters a linker error:

    ...
    ld: framework not found MyFramework_iOS
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    help wanted 
    opened by yonaskolb 13
  • Add support for specifying build configurations for scheme phases

    Add support for specifying build configurations for scheme phases

    Currently we only support specifying build configurations for the test phase of a scheme, this should be extended to support specifying configurations for all phases of a scheme.

    In addition, the build configuration mapping needs to be able to support custom build configurations, to support the scenario when only custom build configurations are present, and the original debug/Debug and release/Release configurations are missing from a project.

    enhancement 
    opened by lyptt 13
  • Can't add .tbd libraries to project

    Can't add .tbd libraries to project

    New Issue Checklist

    • [x] Updated struct to the latest version
    • [x] I have read the documentation to make sure my issue isn't covered already

    Struct version

    3.1.2

    Spec version

    2.1.0

    Which type of spec are you using?

    • [x] project.yml
    • [ ] project.json
    • [ ] Specfile

    Context

    I'm trying to add a couple of .tbd libraries to my project because of a third party library having a requirement to use them. My guess is that I'm incorrectly added this to the project.yml but I'm unsure how I added it differently. Sample project - project.zip

    Reproduction steps

    I've tried adding the library to the references like this.

    references: - sdkroot:libiconv.tbd

    Expected result

    Library gets added the the project file

    Actual result

    ld: library not found for -llibiconv.tbd and if I go into the general tab the library that was attempted to added gets an extra "lib" prefixed. I.e. "liblibconv.tbd".

    help wanted 
    opened by brandonjenniges 11
  • undefined method `new_file'

    undefined method `new_file'

    New Issue Checklist

    • [x] Updated struct to the latest version
    • [x] I have read the documentation to make sure my issue isn't covered already

    Struct version

    2.2.1

    Spec version

    2.2.1

    Which type of spec are you using?

    • [x] project.yml
    • [ ] project.json
    • [ ] Specfile

    Context

    Running struct generate through Jenkins is giving me this error:

    struct generate
    Processing project 'project'...
    undefined method `new_file' for #<Xcodeproj::Project::Object::PBXFileReference:0x007ffe01baf958>
    

    I'm also using Fastlane to invoke struct generate, and running the same fastlane lane after copying the Jenkins workspace contents to a different folder works fine. This error only happens when running through Jenkins.

    Expected result

    Expected project file to be created

    Actual result

    undefined methodnew_file' for #Xcodeproj::Project::Object::PBXFileReference:0x007ffe01baf958` error

    bug 
    opened by brandonjenniges 11
  • How to link to Carthage dependancies

    How to link to Carthage dependancies

    I'm trying to add references to Carthage dependancies like this

    references:
      - location: Carthage/Build/iOS/Alamofire.framework
    

    But the target doesn't build saying No such module 'Alamofire'. Is there more configuration required to get this working?

    help wanted 
    opened by yonaskolb 11
  • Pass value to yml file and replace the configuration template

    Pass value to yml file and replace the configuration template

    Can't access environment variables inside yml file

    • I am trying to create an interactive shell which collects some required information from user and then it passes the data to yml by setting environment variables, but unfortunately yml file is not accessing environment variable

    If this method is not possible then please suggest some alternative method to acheive the same result

    Code Block

    configuration:
      ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
      INFOPLIST_FILE: iOSTest/Info.plist
      PRODUCT_BUNDLE_IDENTIFIER: ${BUNDLEID}
      IPHONEOS_DEPLOYMENT_TARGET: '11.0'
    

    Here BUNDLEID is the environment variable which i dynamically collected through cli

    Struct version

    4.0.1

    Spec version

    Version 2.2.0

    Which type of spec are you using?

    project.yml

    opened by adarshjayan7574 0
  • Installation Issue - Please Help

    Installation Issue - Please Help

    Can't run after installing

    I installed struct using gem install struct. it successfully installs, but struct doesn't seem to be working.

    I'm using ruby 2.6.3p62, on an M1 mac on Big Sur v11.1

    Any ideas on how I can fix this issue?

    Below is the output after running the command struct -v

    Error Message

    ~ % struct Traceback (most recent call last): 25: from /usr/local/bin/struct:23:in <main>' 24: from /usr/local/bin/struct:23:inload' 23: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/bin/struct:2:in <top (required)>' 22: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:inrequire' 21: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 20: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/struct_bin.rb:2:in<top (required)>' 19: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 18: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:inrequire' 17: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/binsupport/struct_bin.rb:8:in <top (required)>' 16: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/binsupport/struct_bin.rb:8:inrequire_relative' 15: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/watch/watcher.rb:2:in <top (required)>' 14: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/watch/watcher.rb:2:inrequire_relative' 13: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/processor/spec_processor.rb:1:in <top (required)>' 12: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/processor/spec_processor.rb:1:inrequire_relative' 11: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder.rb:1:in <top (required)>' 10: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder.rb:1:inrequire_relative' 9: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder_dsl.rb:2:in <top (required)>' 8: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder_dsl.rb:2:inrequire_relative' 7: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder_20X/spec_file_dsl_20X.rb:2:in <top (required)>' 6: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder_20X/spec_file_dsl_20X.rb:2:inrequire_relative' 5: from /Library/Ruby/Gems/2.6.0/gems/struct-4.0.1/lib/spec/builder/spec_builder_20X/spec_target_dsl_20X.rb:1:in <top (required)>' 4: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:inrequire' 3: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' 2: from /Library/Ruby/Gems/2.6.0/gems/ruby_deep_clone-0.7.2/lib/deep_clone.rb:1:in<top (required)>' 1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in require' /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:inrequire': dlsym(0x7fa4665d21e0, Init_deep_clone): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ruby_deep_clone-0.7.2/lib/deep_clone/deep_clone.bundle (LoadError)

    opened by arvin244 0
  • SPM Support?

    SPM Support?

    Struct version

    4.0.1

    Which type of spec are you using?

    • [x] project.yml

    Any plans on allowing the addition of Swift Package Manager imports via struct. Currently if you try to migrate a project with SPM in you get this:

    undefined methodsource_tree' for nil:NilClass`

    investigation needed feature request 
    opened by khoogheem 1
  • Build Target for Aggregate is not supported with migrate command

    Build Target for Aggregate is not supported with migrate command

    New Issue Checklist

    • [x] Updated struct to the latest version
    • [x] I have read the documentation to make sure my issue isn't covered already

    Struct version

    3.2.1

    Spec version

    2.1.0

    Which type of spec are you using?

    • [x] project.yml
    • [ ] project.json
    • [ ] Specfile

    Context

    I want to create a top level application project which has dependencies on other projects. I can organize this dependency tree very well by creating a project called Packages and putting the Xcode project references in there. And then I can create a single build target which is an aggregate which includes each of the projects in the target dependencies. Then I can simply drop the Packages project into the application project and make the build target for the aggregate the only target dependency. This way I can work on each project individually and when I work on the app it is also isolated yet can have the tree of target dependencies build.

    But Struct does not support aggregate from what I am seeing in the output.

    Reproduction steps

    The migrate function should recognize aggregate build targets.

    Expected result

    Create the structure of Xcode projects as defined above and try the migrate command.

    Actual result

    I get the following output.

    undefined method `product_type' for #<Xcodeproj::Project::Object::PBXAggregateTarget:0x00007fc397c5dde0>
    Did you mean?  product_name
    

    Duplicate

    https://github.com/lyptt/struct/issues/42

    opened by brennanMKE 1
  • Working example Mac app project.yml would help people seeing

    Working example Mac app project.yml would help people seeing "Invalid spec file. Project should have at least one configuration"

    New Issue Checklist

    For users just starting out, a working project.yml file to create a mac app would be nice. Here is one I reverse engineered from a basic app setup in XCode:


    version: 2.1.0 configurations: Debug: overrides: CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION: YES_AGGRESSIVE CLANG_WARN_UNGUARDED_AVAILABILITY: YES_AGGRESSIVE MACOSX_DEPLOYMENT_TARGET: '10.12' SDKROOT: macosx type: debug Release: overrides: CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION: YES_AGGRESSIVE CLANG_WARN_UNGUARDED_AVAILABILITY: YES_AGGRESSIVE MACOSX_DEPLOYMENT_TARGET: '10.12' SDKROOT: macosx type: release targets: MyExampleApp: sources: - MyExampleApp/Assets.xcassets - MyExampleApp/ViewController.m - MyExampleApp/main.m - MyExampleApp/AppDelegate.m i18n-resources: MyExampleApp type: ":application" platform: mac configuration: CODE_SIGN_ENTITLEMENTS: MyExampleApp/MyExampleApp.entitlements CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: 488XXXXXX7 INFOPLIST_FILE: MyExampleApp/Info.plist PRODUCT_BUNDLE_IDENTIFIER: tomachicorp.MyExampleApp MyExampleAppTests: sources: MyExampleAppTests/MyExampleAppTests.m type: ":bundle.unit-test" platform: mac configuration: CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: 488XXXXXX7 INFOPLIST_FILE: MyExampleAppTests/Info.plist PRODUCT_BUNDLE_IDENTIFIER: tomachicorp.MyExampleAppTests TEST_HOST: "$(BUILT_PRODUCTS_DIR)/MyExampleApp.app/Contents/MacOS/MyExampleApp" references: - MyExampleApp MyExampleAppUITests: sources: MyExampleAppUITests/MyExampleAppUITests.m type: ":bundle.ui-testing" platform: mac configuration: CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: 488XXXXXX7 INFOPLIST_FILE: MyExampleAppUITests/Info.plist PRODUCT_BUNDLE_IDENTIFIER: tomachicorp.MyExampleAppUITests TEST_TARGET_NAME: MyExampleApp references: - MyExampleApp

    perhaps this could be added to one of: https://github.com/lyptt/struct/blob/master/res/target_config_profiles/platform_mac.yml https://github.com/lyptt/struct/wiki/Specfile-format:-v2.0

    Struct version

    struct -v
    3.1.2

    suggestion 
    opened by tomachinz 1
Releases(4.0.1)
  • 4.0.1(Jun 25, 2020)

  • 4.0.0(May 25, 2020)

    • Struct 4.0 is here! There's a few breaking changes in this release to allow Struct to move forward with the latest improvements in Xcode, Swift and Ruby.
    • Xcode 11 and Swift 5 support has landed! The default Swift version is now 5.2.
    • All of the default deployment targets now target the latest releases of each supported platform.
    • Ruby 2.6.3 is now the minimum version of Ruby for Struct, following the existing strategy of supporting the latest macOS's pre-installed version of Ruby. As such, if you currently use the system Ruby in El Capitan, please either upgrade to Catalina, or use RVM to maintain your current Ruby version.
    • Added support for native watchOS applications
    • Removed support for 1.X.X spec files. Check out the migration guide on the wiki to move to a newer spec format.
    • Fixed bugs with CocoaPods integration
    Source code(tar.gz)
    Source code(zip)
  • 3.2.1(Dec 19, 2018)

  • 3.2.0(Dec 6, 2018)

  • 3.1.2(Nov 3, 2017)

  • 3.1.1(Oct 19, 2017)

  • 3.1.0(Oct 2, 2017)

    • Fixed a bug which would cause launch actions in a scheme to not be generated when an archive action is not also defined in that scheme
    • Fixed nil dereference issues with configuration blocks
    • Added support for .c, .cpp and .cxx source files (thanks @steveholt55!)
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(Sep 25, 2017)

    • Struct 3.0 is here! There's a few breaking changes in this release to allow Struct to move forward with the latest improvements in Xcode, Swift and Ruby.
    • Xcode 9 and Swift 4.0 support has landed! The default Swift version is now 4.0, and Struct now includes additional project settings introduced in Xcode 9. All of the default deployment targets now target the latest releases of each supported platform. Xcode 8 is unsupported as of Struct 3.0.0, however critical bug fixes will be released for Struct 2 until the next major Xcode release.
    • Ruby 2.2.0 is now the minimum version of Ruby for Struct, following the existing strategy of supporting the latest macOS's pre-installed version of Ruby. As such, if you currently use the system Ruby in Sierra, please either upgrade to High Sierra, or use RVM to maintain your current Ruby version.
    Source code(tar.gz)
    Source code(zip)
  • 2.2.1(Jun 1, 2017)

  • 2.2.0(May 31, 2017)

    • Spec 2.2.0 is here! Support for linking and embedding framework targets to an application target within the same project has been added. Also, inputs and outputs can now be specified for target scripts, and the analyze phase in a scheme can now be defined.
    • tvOS is now supported
    • Shared source files between targets are now supported
    • An issue where the product file extension was not correctly defined for certain product types has been fixed
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(May 21, 2017)

  • 2.1.0(May 20, 2017)

    • Spec 2.1.0 is here! This contains a few improvements for defining schemes, as well as introducing improved syntax in the Specfile format for declaring project configurations.
    • You can now declare project configurations as 'debug' or 'Debug', and 'release' or 'Release' without specifying the configuration type! This works across any spec version, so there's no migration necessary to benefit from this change. Struct will continue to maintain backwards compatibility for specifying the types by hand, however feel free to remove this declaration if you're using 'Debug' and 'Release' in your project configuration.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(May 19, 2017)

    • Spec 2.0.0 is here! Support for defining schemes has been added, along with a handful of improvements to make defining your specs much simpler. For more information, check out the migration guide: https://git.io/vHemR
    • Also new in Spec 2.0.0 is the ability to hook into the project generation lifecycle. You can now perform actions before a project is generated, and after a project is generated, and you're provided metadata to enable performing any pre-post processing on your projects. This works in both YAML/JSON and Specfile formats!
    • Spec 1.0.0 has now been removed and is no longer supported. If you're still using the 1.0.0 format, you can continue to use Struct 1.3.1.
    • Various internal improvements have been made to ensure that new features are much easier to add, without negatively affecting the stability of the software. We've raised our code coverage considerably to boot!
    • The Struct API exposed when using Struct as a gem has had an overhaul to make working with internal models and project generation methods much simpler.
    • Project migration is now much more capable, you'll notice much less complaining from Struct when migrating your existing Xcode projects!
    • Various bug fixes to the new Spec 2.0.0 format.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(May 18, 2017)

    • Spec 2.0.0 is here! Support for defining schemes has been added, along with a handful of improvements to make defining your specs much simpler. For more information, check out the migration guide: https://git.io/vHemR
    • Also new in Spec 2.0.0 is the ability to hook into the project generation lifecycle. You can now perform actions before a project is generated, and after a project is generated, and you're provided metadata to enable performing any pre-post processing on your projects. This works in both YAML/JSON and Specfile formats!
    • Spec 1.0.0 has now been removed and is no longer supported. If you're still using the 1.0.0 format, you can continue to use Struct 1.3.1.
    • Various internal improvements have been made to ensure that new features are much easier to add, without negatively affecting the stability of the software. We've raised our code coverage considerably to boot!
    • The Struct API exposed when using Struct as a gem has had an overhaul to make working with internal models and project generation methods much simpler.
    • Project migration is now much more capable, you'll notice much less complaining from Struct when migrating your existing Xcode projects!
    Source code(tar.gz)
    Source code(zip)
  • 1.3.2(Apr 11, 2017)

  • 1.3.1(Mar 26, 2017)

    • Spec 1.3.0 is here! Support for compile flags on source files has been added, along with the ability to link to static libraries on targets. You can now generate WatchOS targets too!
    • Spec 1.0.0 is now deprecated and will be removed in a future release. Make sure to update your spec files to the latest version!
    • Ruby 2.0.0 is now supported! If you're on the latest macOS you can now install struct directly without RVM.
    • Improved file excludes, you can now exclude whole directories instead of just files.
    • Improved project naming when generating projects for variants - now no transformation is done on project names, so you can name your projects whatever you want.
    • The way you use struct has now changed. '--generate' becomes 'generate'. Run 'struct help' for the full list of commands!
    • Fixed issues where passing too few arguments in Specfile declarations would bail with unhelpful errors.
    • Removed unhelpful warnings from the 'struct watch' command when using symbolic links.
    • Fixed warnings when parsing source options.
    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Mar 26, 2017)

    • Spec 1.3.0 is here! Support for compile flags on source files has been added, along with the ability to link to static libraries on targets. You can now generate WatchOS targets too!
    • Spec 1.0.0 is now deprecated and will be removed in a future release. Make sure to update your spec files to the latest version!
    • Ruby 2.0.0 is now supported! If you're on the latest macOS you can now install struct directly without RVM.
    • Improved file excludes, you can now exclude whole directories instead of just files.
    • Improved project naming when generating projects for variants - now no transformation is done on project names, so you can name your projects whatever you want.
    • The way you use struct has now changed. '--generate' becomes 'generate'. Run 'struct help' for the full list of commands!
    • Fixed issues where passing too few arguments in Specfile declarations would bail with unhelpful errors.
    • Removed unhelpful warnings from the 'struct watch' command when using symbolic links.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Mar 13, 2017)

    • There's now a new way to define your projects! Check out Specfile, a rich DSL for defining your projects in Ruby: https://git.io/vyKuh
    • Cocoapods support has landed! See https://git.io/vyPOj for details.
    • You can now generate individual projects in a multi-variant project. Just type 'struct -g my-variant'. Simple!
    • Spec profiles now target the latest deployment targets for iOS - iOS 10.2.
    • You can now define framework targets within a spec file. Additional functionality was also added so you can run unit tests on framework targets.
    • Fixed an issue where source files were overridden in the wrong order
    • Fixed an issue where certain DSL validation errors would not be visible
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Mar 13, 2017)

    • There's now a new way to define your projects! Check out Specfile, a rich DSL for defining your projects in Ruby: https://git.io/vyKuh
    • Cocoapods support has landed! See https://git.io/vyPOj for details.
    • You can now generate individual projects in a multi-variant project. Just type 'struct -g my-variant'. Simple!
    • Spec profiles now target the latest deployment targets for iOS - iOS 10.2.
    • You can now define framework targets within a spec file. Additional functionality was also added so you can run unit tests on framework targets.
    • Fixed an issue where source files were overridden in the wrong order
    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Mar 10, 2017)

  • 1.1.0(Mar 9, 2017)

    • Spec 1.2.0 is here! Spec 1.2.0 supports including xcconfig files to externally manage project and target configuration, and the ability to place run scripts before or after your build phases
    • Numerous bug fixes to migration, writing projects, and parsing specs
    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Mar 7, 2017)

  • 1.0.0(Mar 3, 2017)

    • Huge stability improvements to parsers for the 1.0.0 and 1.1.0 spec formats
    • Laid the groundwork for spec 1.2.0
    • Xcodegen is now known as struct, install it with gem install struct!
    Source code(tar.gz)
    Source code(zip)
  • 0.4.1(Feb 22, 2017)

  • 0.4.0(Feb 18, 2017)

    • The $base variant is now generated if omitted
    • Issues with parsing variant configuration data have now been resolved
    • Added support for adding local frameworks in the references section to customise how they're copied and code signed
    • Added more detailed console output when generating variant projects
    Source code(tar.gz)
    Source code(zip)
  • 0.3.1(Feb 17, 2017)

  • 0.3.0(Feb 17, 2017)

    • Added a new beta Specfile format containing new functionality
    • Added support for subprojects (v1.1.0)
    • Added support for including Objective-C source files (*.m and *.mm) (v1.1.0)
    • Added support for including Core Data models (v1.1.0)
    • Added support for including multiple source directories (v1.1.0)
    • Various bug fixes
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jan 16, 2017)

    • Added support for migrating Xcode projects to spec files. This only supports a handful of scenarios, please see https://git.io/vMKs9 for more details.
    • Fixed a parsing bug with multi-configuration overrides in targets
    Source code(tar.gz)
    Source code(zip)
  • 0.1.5(Dec 17, 2016)

    • Implemented full spec serialisation - the API can now write full spec files
    • Added public method for project writing, fixed some spec writing bugs
    Source code(tar.gz)
    Source code(zip)
  • 0.1.4(Dec 17, 2016)

    • Added parse command to easily see spec parsing output
    • Added support for linking to framework files in your source directory
    • Added support for excluding files based on exclude globs
    • Updated example project spec based on new functionality
    • Updated the xcodegen API to support per-version parsing
    • Added message indicating that the watcher's actually doing something
    • Updated project sample to correct schema & syntax
    • Added class, struct and target generators, target serialisation
    • Added writer for project configurations
    Source code(tar.gz)
    Source code(zip)
Owner
Rhys
撲殺天使
Rhys
📝 Read, update and write your Xcode projects

XcodeProj XcodeProj is a library written in Swift for parsing and working with Xcode projects. It's heavily inspired by CocoaPods XcodeProj and xcode.

Tuist 1.7k Dec 28, 2022
LinkedLog is a Xcode plugin that includes a Xcode PCH header file template that adds the macros `LLog` and `LLogF` and parses their output to link from the console to the corresponding file and line.

LinkedLog Xcode Plugin LinkedLog is a Xcode plugin that includes a Xcode PCH file template that adds the macros LLog and LLogF. The LLog macro will wo

Julian F. Weinert 22 Nov 14, 2022
Easily generate cross platform Swift framework projects from the command line

SwiftPlate Easily generate cross platform Swift framework projects from the command line. SwiftPlate will generate Xcode projects for you in seconds,

John Sundell 1.8k Dec 27, 2022
ConfettiKit is a custom framework used to add Confetti on your iOS/iPadOS projects.

ConfettiKit is a custom framework used to add Confetti on your iOS/iPadOS projects. The kit provides variety of customisations inorder to design a confetti which matches your project's UI. ConfettiKit makes your work of adding Confetti on your project with just one line of code.

Gokul Nair 14 Sep 27, 2022
Challenging each other to complete pet projects!

Podlodka Pet Project Challenge Мотивируем друг друга на завершение своих пет проджектов! Каждую неделю каждый участник вносит в банк 1 ставку и ведет

Vladimir Korolev 2 Aug 27, 2022
Use this template as a starting point for any Swift 5 module that you want other people to include in their projects

Swift 5 Module Template Use this template as a starting point for any Swift 5 mo

James Knipe 0 Dec 28, 2021
A command line tool for managing Swift Playground projects on your Mac.

swift-playground-tools A command line tool for managing Swift Playground projects on your Mac. Generate Xcode Project $ playground-tools generate-xcod

Liam Nichols 0 Dec 31, 2021
OpenAPI specification generator for Vapor based Swift projects.

VaporToOpenAPI VaporToOpenAPI is a Swift library which can generate output compatible with OpenAPI version 3.0.1 from Vapor code. You can use generate

null 3 Dec 15, 2022
Ios jetpack - A codabase for iOS projects foundations

iOSJetpack A codabase for iOS projects foundations Neworking Data Reusable Proto

MonsterTechStudio 1 Jan 24, 2022
SwiftUITemplate - Template repository for SwiftUI projects

SwiftUITemplate Template repository for SwiftUI projects. Environment Name Versi

y-okudera 2 Jul 10, 2022
A Swift library for hardware projects on Linux/ARM boards with support for GPIOs/SPI/I2C/PWM/UART/1Wire.

A Swift library for hardware projects on Linux/ARM boards with support for GPIOs/SPI/I2C/PWM/UART/1Wire. Summary This library provides an easy way to

uraimo 1.3k Dec 26, 2022
Save development time! Respresso automatically transforms and delivers your digital assets into your projects

Introduction Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import the latest

Respresso 10 Nov 8, 2022
Save development time! Respresso automatically transforms and delivers your digital assets into your projects

Respresso Android client Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import

Respresso 11 May 27, 2021
Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects

Introduction Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import the latest

Respresso 10 Nov 8, 2022
Save development time! Respresso automatically transforms and delivers your digital assets into your projects

Respresso iOS client Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import the

Respresso 50 May 1, 2021
These projects are the result of following Paul Hudson's "100 Days of SwiftUI" tutorial.

100-days-swiftui-tutorials These projects are the result of following Paul Hudson's "100 Days of SwiftUI" tutorial. Please note, these projects were d

Eric Tolson 3 Dec 16, 2022
🧸 Xcode Playground management made easy

Toybox Toybox made easy to manage Xcode Playgrounds. You can create and open Xcode Playground from CLI. $ toybox create Snippet # Generate ~/.toybox/S

Kohki Miki 130 Nov 8, 2022
A Swift command line tool for generating your Xcode project

XcodeGen XcodeGen is a command line tool written in Swift that generates your Xcode project using your folder structure and a project spec. The projec

Yonas Kolb 5.9k Jan 9, 2023
SwiftLint Plugin for Xcode.

SwiftLint Xcode Plugin Demo Usage Set SwiftLint Path default: Default path is /usr/local/bin/swiftlint relative: Relative path with the current projec

null 18 Jul 23, 2022