SlideShare a Scribd company logo
Exploring The New Titanium
 Command Line Interface

          Chris Barber
           Sr. Platform Lead
             Appcelerator
              @cb1kenobi
       cbarber@appcelerator.com
Meet Chris

         • Chris Barber
         • JavaScript Team Lead
         • Mobile Web, CLI
         • @cb1kenobi
Why Create a New CLI?
Titanium 2.X CLI

         • Python 2.7
         • Inconsistent
         • Poorly documented
         • Difficult to use
         • Even more difficult to maintain
Project Creation

        chris@yojimbo:~$ python /Users/chris/Library/Application
        Support/Titanium/mobilesdk/osx/2.1.3.GA/project.py


        Usage:
        project.py <name> <id> <directory> [iphone,android,mobileweb] [android_sdk] [--update-platforms]


        Options:
         -h, --help        show this help message and exit
         -u, --update-platforms
                       Initialize project for any missing platforms. Use this
                       to add a platform to the project without overwriting
                       tiapp.xml and app.js.




        chris@yojimbo:~$ python /Users/chris/Library/Application
        Support/Titanium/mobilesdk/osx/2.1.3.GA/project.py myapp com.mycompany.myapp . foo
Build iOS App

       chris@yojimbo:~$ python /Users/chris/Library/Application
       Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py




       builder.py <command> <version> <project_dir> <appid> <name> [options]

       available commands:

        install   install the app to itunes for testing on iphone
        simulator build and run on the iphone simulator
        adhoc       build for adhoc distribution
        distribute build final distribution bundle
        xcode      build from within xcode
        run       build and run app from project folder
Build iOS App

       chris@yojimbo:~$ python /Users/chris/Library/Application
       Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py simulator



       [INFO] One moment, building ...
       Traceback (most recent call last):
         File "/Users/chris/Library/Application
       Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py", line 1594, in <module>
          main(sys.argv)
         File "/Users/chris/Library/Application
       Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py", line 608, in main
          iphone_version = dequote(args[2].decode("utf-8"))
       IndexError: list index out of range



       builder.py simulator <ios-version> <project-dir> <id> <name> [<device-family> [<sim-type>
       [<debug-host>]]]
OK, We Need A New CLI
Building a New CLI

         • Python 3? Node.js? Ruby? Java+Rhino?
         • How comfortable are we with these
           technologies?
         • Compatible license?
         • What libraries are available?
            • XML/JSON parsing
            • Code minification
            • Image resizing
Appc   Node.js

         • JavaScript!
         • MIT License
         • Small size
         • No native dependencies
         • Package manager (npm)
         • Tons of great community modules
Getting Started
Installing the Titanium CLI
First Things First

          • Node.js
             • 0.8 or newer
          • NPM
Installation




               npm install -g titanium

                             Note: may need to run as npm sudo
Touring the CLI
Built-in Commands
Running The CLI

       chris@yojimbo:~$ titanium
       Titanium Command-Line Interface, version 3.0.10
       Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

       Usage: titanium <command> [options]

       Commands:
        config get and set config options
        help displays this help screen
        info display development environment information
        login logs into the Appcelerator network
        logout logs out of the Appcelerator network
        module manages installed Titanium Modules
        plugin manages installed Titanium Plugins
        sdk    manages installed Titanium SDKs
        setup run the setup wizard
        status displays session information

       Global Flags:
        --banner, --no-banner displays Titanium version banner [default: true]
        --colors, --no-colors use colors in the terminal [default: true]
        -h, --help        displays help
        --prompt, --no-prompt prompt for missing options [default: true]
        -q, --quiet        suppress all output
        -v, --version       displays the current version
Help!
titanium <cmd> -h       chris@yojimbo:~$ titanium help config
                        Titanium Command-Line Interface, version 3.0.10
titanium <cmd> --help   Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.
titanium help <cmd>
                        Usage: titanium config [--remove] [--output <value>] [<key>] [<value>]

                        Gets and sets config options. If no key is specified, then all key/values are
                        returned.

                        The config file is located at: /Users/chris/.titanium/config.json

                        Config Arguments:
                         <key> the key to get or set
                         <value> the value to set the specified key

                        Config Flags:
                         -r, --remove remove the specified config key and all its descendants

                        Config Options:
                         -o, --output <value> output format [report, json]

                        Global Flags:
                         --banner, --no-banner displays Titanium version banner [default: true]
                         --colors, --no-colors use colors in the terminal [default: true]
                         -h, --help        displays help
                         --prompt, --no-prompt prompt for missing options [default: true]
                         -q, --quiet        suppress all output
                         -v, --version       displays the current version
Setup Wizard
Basic Setup
titanium setup

Advanced Setup
                        • Initializes the CLI configuration
titanium setup -a



                    chris@yojimbo:~$ titanium setup
                    Titanium Command-Line Interface, version 3.0.10
                    Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                    Enter ctrl-c at any time to quit

                    What is your name? (this is used as the default for the "author" field in the tiapp.xml or module
                    manifest file when creating new projects) (Chris Barber)
                    What is your email address used for logging into the Appcelerator Network? (cbarber@appcelerator.com)
                    What would you like as your default locale? (examples: "en", "de", "fr") (en-us)
                    What Titanium SDK would you like to use by default? (2.1.3.GA)
                    Path to your workspace where your projects should be created: (~/appc/workspace)
                    Path to the Android SDK: (this is needed for building Android apps)

                    Configuration saved
Manual Configuration
Get All Values
titanium config

Get All User.*
                          • Get and set config settings
Settings
titanium config user
                       chris@yojimbo:~$ titanium config
Set Android SDK Path
titanium config        android.ndkPath       = "/opt/android-ndk"
  android.sdkPath      android.sdkPath       = ""
  “/path/to/sdk”       app.idprefix       = "com.appcelerator"
                       app.publisher       = "Appcelerator"
                       app.sdk          = "2.1.3.GA"
                       app.url         = ""
                       app.workspace         = "~/appc/workspace"
                       cli.colors       = true
                       cli.failOnWrongSDK = false
                       cli.logLevel      = "trace"
                       cli.prompt        = true
                       cli.quiet       = false
                       ios.developerName = "Chris Barber"
                       ios.distributionName = "Appcelerator, Inc."
                       paths.commands          = []
                       paths.hooks         = []
                       paths.plugins       = ["~/appc/ti.alloy"]
                       user.email        = "cbarber@appcelerator.com"
                       user.locale       = "en-us"
                       user.name          = "Chris Barber"
Authentication
Logging In        chris@yojimbo:~$ titanium login
titanium login    Titanium Command-Line Interface, version 3.0.10
  <username>
                  Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.
Am I Logged In?
titanium status   Username: (cbarber@appcelerator.com)
                  Password:
Logging out
titanium logout   Logged in successfully

                  chris@yojimbo:~$ titanium status
                  Titanium Command-Line Interface, version 3.0.10
                  Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                  You are currently logged in as cbarber@appcelerator.com

                  chris@yojimbo:~$ titanium logout
                  Titanium Command-Line Interface, version 3.0.10
                  Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                  Logged out successfully

                      • Required for most commands
                      • Adds your app to my.appcelerator.com
                      • Username is your e-mail address
System Info
                        chris@yojimbo:~$ titanium info
Includes:               Titanium Command-Line Interface, version 3.0.10

• OS info
                        Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                        Operating System
• node.js & npm          Name
                         Version
                                                         = Mac OS X
                                                         = 10.8.2
• Xcode versions         Memory                           = 16.0GB


• iOS SDKs &            node.js
                         node.js Version                    = v0.8.12
                         npm Version                        = 1.1.63
  simulators
• iOS provisioning
                        Xcode
                        4.4.1 (build 4F1003)
                         Install Location                   = /Applications/Xcode44.app/Contents/Developer
  profiles &             iOS SDKs
                         iOS Simulators
                                                           = 5.1
                                                             = 5.0, 5.1
  keychains             4.5 (build 4G182)
                         Install Location                   = /Applications/Xcode45.app/Contents/Developer
• Titanium SDKs          iOS SDKs
                         iOS Simulators
                                                           = 6.0
                                                             = 5.0, 5.1, 6.0

• Android SDKs,         iOS Certificates
                         Development                        = Chris Barber (XXXXXXXXXX)
  addons, and AVDs       Distribution                     = Appcelerator, Inc.
                         Apple WWDR                          = installed

                        Development iOS Provisioning Profiles
Get All Info            My Provisioning Profile
                         UUID                         = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
titanium info            App Prefix
                         App Id
                                                        = XXXXXXXXXX
                                                      = com.appcelerator.*

                        iOS Keychains
                         System Default                     = System Default
OS Info Only             login.keychain                    = /Users/chris/Library/Keychains/login.keychain
                         Microsoft_Intermediate_Certificates        = /Users/chris/Library/Keychains/Microsoft_Intermediate_Certificates
titanium info -t os      System.keychain                     = /Library/Keychains/System.keychain

                        Titanium SDKs
                        2.1.3.GA
iOS Info Only            Install Location
                         Platforms
                                                           = /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA
                                                          = android, iphone, mobileweb
                         git Hash                        = unknown
titanium info -t ios     git Timestamp                      = unknown

                        Android Platforms
                        android-8
Android & Node.js        Name
                         API Level
                                                         = Android 2.2
                                                          =8
Info Only                Revision
                         Skins
                                                          =3
                                                        = HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
titanium info -t         ABIs
                         Path
                                                        = armeabi
                                                        = /opt/android-sdk/platforms/android-8

android,nodejs          Android Add-ons
                        Google Inc.:Google APIs:8
                         Name                            = Google APIs
                         Vendor                          = Google Inc.
Output as JSON           Revision
                         Description
                                                          =2
                                                           = Android + Google APIs
titanium info -o json    Skins
                         ABIs
                                                        = WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA
                                                        = armeabi
                         Path                           = /opt/android-sdk/add-ons/addon-google_apis-google-10
                         Based On                          = Android 2.2 (API level 8)
                         Libraries                       = com.google.android.maps: API for Google Maps (maps.jar)
Modules & Plugins
Get Installed Modules   chris@yojimbo:~$ titanium module
titanium module
                        Titanium Command-Line Interface, version 3.0.10
                        Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.
Get Installed Modules
Including a Project
titanium module         Global Modules
  –project-dir
  /path/to/project      Android
                         ti.cloudpush
                           2.0.7 /Users/chris/Library/Application Support/Titanium/modules/android/ti.cloudpush/2.0.7

                        CommonJS
                         ti.cloud
                        commonjs/ti.cloud/2.2.0
                           2.3.0 /Users/chris/Library/Application Support/Titanium/modules/commonjs/ti.cloud/2.3.0
                           2.0.5 /Library/Application Support/Titanium/modules/commonjs/ti.cloud/2.0.5

                        iPhone
                         ti.jira
                           1.0 /Users/chris/Library/Application Support/Titanium/modules/iphone/ti.jira/1.0

                        Mobile Web
                         ti.oldmodule
                           0.1 /Users/chris/Library/Application Support/Titanium/modules/mobileweb/ti.oldmodule/0.1
Modules & Plugins
Get Installed Plugins
titanium plugin

Output as JSON
titanium plugin         chris@yojimbo:~$ titanium plugin
  -o json               Titanium Command-Line Interface, version 3.0.10
                        Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                        User Path Plugins

                        No project plugins found

                        Global Plugins

                        another_plugin
                         1.0 /Users/chris/Library/Application Support/Titanium/plugins/another_plugin/1.0

                        test_plugin
                         1.0 /Users/chris/Library/Application Support/Titanium/plugins/test_plugin/1.0

                        ti.alloy
                          1.0 /Users/chris/Library/Application Support/Titanium/plugins/ti.alloy/1.0
Wait a sec…
Where’s the create and build commands?
Downloading An SDK
List Intalled SDKs        chris@yojimbo:~$ titanium sdk
titanium sdk              Titanium Command-Line Interface, version 3.0.10
                          Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.
Install Latest 3.0
titanium sdk install
  --branch 3_0_X          Installed SDKs:
  --default                 2.1.3.GA [default] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA
                            2.1.2.GA       /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.2.GA
Install Latest Stable       2.1.0.GA       /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.0.GA
titanium sdk install        2.0.2.GA       /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA

Install Latest Stable &
Set as Default SDK
titanium sdk install
  --default

Install Bleeding Edge     chris@yojimbo:~$ titanium sdk install --branch 3_0_X --default
titanium sdk install
                          Titanium Command-Line Interface, version 3.0.10
  --branch master
                          Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                          Downloading http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_0_X/mobilesdk-
                          3.0.0.v20121018214614-osx.zip
                           100% [=================================================================] 0.0s

                          Extracting SDK...

                          Saving SDK 3.0.0.v20121018214614 as the default.
                          Titanium SDK 3.0.0.v20121018214614 successfully installed!
New Commands!

      chris@yojimbo:~$ titanium
      Titanium Command-Line Interface, version 3.0.10
      Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

      Usage: titanium <command> [options]

      Commands:
       build builds a project
       clean removes previous build directories
       config get and set config options
       create creates a new mobile application or module
       help   displays this help screen
       info   display development environment information
       login logs into the Appcelerator network
       logout logs out of the Appcelerator network
       module manages installed Titanium Modules
       plugin manages installed Titanium Plugins
       project get and set tiapp.xml settings
       sdk    manages installed Titanium SDKs
       setup run the setup wizard
       status displays session information

      Global Flags:
       --banner, --no-banner displays Titanium version banner [default: true]
       --colors, --no-colors use colors in the terminal [default: true]
       -h, --help        displays help
       --prompt, --no-prompt prompt for missing options [default: true]
       -q, --quiet       suppress all output
       -v, --version      displays the current version
SDK Commands
create, project, build, clean
Creating a Project
Create a Project        chris@yojimbo:~$ titanium create
titanium create         Titanium Command-Line Interface, version 3.0.10
                        Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.
Create Project With
All Arguments
titanium sdk create     Target platforms: (android,ios,ipad,iphone,mobileweb)
  --id com.appc.myapp   App ID: com.appcelerator.myapp
  --name myapp          Project name: myapp
  --platforms
android,iphone,ipad,    [INFO] Creating Titanium Mobile application project
mobileweb               [DEBUG] Copying /Users/chris/Library/Application
  --workspace-dir       Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default =>
  /path/to/workspace    /Users/chris/myapp
                        [DEBUG] Copying /Users/chris/Library/Application
                        Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources
                        => /Users/chris/myapp/Resources
                        [DEBUG] Copying /Users/chris/Library/Application
                        Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources/a
                        ndroid => /Users/chris/myapp/Resources/android
                        [DEBUG] Copying /Users/chris/Library/Application
                        Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources/a
                        ndroid/images => /Users/chris/myapp/Resources/android/images
                        [DEBUG] Copying /Users/chris/Library/Application
                        Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources/a
                        ndroid/images/res-notlong-port-mdpi => /Users/chris/myapp/Resources/android/images/res-
                        notlong-port-mdpi
                        [INFO] Project 'myapp' created successfully in 32ms
Getting Project Info
Basic Info
titanium project

Copy Platform
                             • Tool for interacting with the tiapp.xml
Resource Files
titanium project          chris@yojimbo:~/myapp$ titanium project
  --deployment-targets
                          Titanium Command-Line Interface, version 3.0.10
  android,ios,mobileweb
                          Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                          Deployment Targets:
                           android = true
                           ipad   = false
                           iphone = true
                           mobileweb = true

                          Project Properties:
                           sdk-version = 3.0.0
                           id      = com.appcelerator.myapp
                           name      = myapp
                           version = 1.0
                           publisher = not specified
                           url     = not specified
                           description = not specified
                           copyright = not specified
                           icon     = appicon.png
                           analytics = true
                           guid     = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Building a Project
Platforms:            chris@yojimbo:~/myapp$ titanium build --platform ios
• iOS                 Titanium Command-Line Interface, version 3.0.10
• Mobile Web          Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.
• Android             [DEBUG] No project level plugins to load
                      [DEBUG] Loaded plugin hooks:
Special Hooks:        [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/cli/hooks/plugins.js
• Run in Simulator    [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone/cli/hooks/install.js
• Install on Device   [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone/cli/hooks/package.js
                      [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone/cli/hooks/run.js
• Package for         [INFO] Build type: development
  Distribution        [DEBUG] Titanium iOS SDK directory: /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone
                      [INFO] Building for target: simulator
                      [INFO] Building using iOS SDK: 6.0
                      [INFO] Building for iOS Simulator: 6.0
                      [INFO] Building for device family: universal
                      [DEBUG] Setting Xcode target to Debug
                      [DEBUG] Setting Xcode build OS to iphonesimulator6.0
                      [DEBUG] Xcode installation: /Applications/Xcode45.app/Contents/Developer
                      [DEBUG] iOS WWDR certificate: installed
                      [INFO] Building for iOS 6.0; using 4.3 as minimum iOS version
                      [DEBUG] Minimum iOS version: 4.3
                      [INFO] Debugging disabled
                      [DEBUG] Building for the following architectures: armv7 armv7s i386
                      [DEBUG] Forcing rebuild: githash changed since last build
                      [DEBUG] Was: a50c927
                      [DEBUG] Now: ab2b280
                      [INFO] Cleaning old build directory
                      [DEBUG] Would be firing "compile" legacy plugin hook if it was supported
                      [INFO] Building Info.plist
                      [INFO] No Titanium Modules required, continuing
                      [INFO] Performing full rebuild
                      [INFO] Copying Xcode iOS files

                      ...
Cleaning the Project
Nuke All Platform
Build Directories
titanium clean
                          • Completely removes the platform specific build
Nuke a Specific
Platform’s Build            directories
Directory
titanium clean
  –platform android




                      chris@yojimbo:~/myapp$ titanium clean
                      Titanium Command-Line Interface, version 3.0.10
                      Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved.

                      [INFO] Project cleaned successfully in 1ms
Extending the CLI
Plugins, commands, and hooks
Plugins

          • Similar to Titanium Modules
          • Legacy plugin.py not supported today
          • CLI commands & hooks
          • Installed globally or in project directory
          • Enabled via the tiapp.xml <plugins>
Sample Command
myplugin/1.0/cli/com   exports.cliVersion = '>=3.X';
mands/magic.js         exports.desc = 'does magical things’;

                       exports.config = function (logger, config, cli) {
                          return {
                             flags: {
                                extra: {
                                  abbr: 'e',
                                  desc: 'adds more magic’
                                }
                             }
                          };
                       };

                       exports.validate = function (logger, config, cli) {
                          // nothing to validate
                       };

                       exports.run = function (logger, config, cli) {
                         var s = 'doing magical stuff!';

                            if (cli.argv.extra) {
                                s = s.replace(/./g, function (c, i) {
                                    return i % 2 == 0 ? c.toUpperCase() : c.toLowerCase();
                                });
                            }

                            logger.log(s);
                       };
Sample Hook
myplugin/1.0/cli/hook
s/my_build_hook.js



                        exports.cliVersion = '>=3.X';

                        exports.init = function (logger, config, cli) {
                          cli.addHook('build.pre.compile', function (data, finished) {
                              logger.log('modifying some code before build starts');
                              finished();
                          });

                             cli.addHook('build.post.compile', {
                                 priority: 900,
                                 post: function (data, finished) {
                                   logger.log('packaging some extra files after the build');
                                   finished();
                                 }
                             });

                             cli.addHook('build.finalize', function (data, finished) {
                                 logger.log('cleaning up my mess');
                                 finished();
                             });
                        };
Demo
Kick the tires & light the fires
What’s Next?
// TODO:

           • More plugin hooks
              • Project creation, chaging project settings, etc
           • Project exporting & migration tools
           • Better support for multiple Titanium SDKs




           • What would you like to see?
Summary
Just in case you were sleeping
The New CLI Rocks

        • Easy to install, easy to use
        • Fast as shit
        • Built-in documentation
        • Extensible plugin architecture
        • Consistent arguments
        • Argument prompting
        • Internationalization
        • Colors!
Get It Today!




         npm install -g titanium
         titanium sdk install --branch 3_0_X --default

                                                 Note: may need to run npm as sudo
Chris Barber
       @cb1kenobi
cbarber@appcelerator.com

More Related Content

Exploring the Titanium CLI - Codestrong 2012

  • 1. Exploring The New Titanium Command Line Interface Chris Barber Sr. Platform Lead Appcelerator @cb1kenobi cbarber@appcelerator.com
  • 2. Meet Chris • Chris Barber • JavaScript Team Lead • Mobile Web, CLI • @cb1kenobi
  • 3. Why Create a New CLI?
  • 4. Titanium 2.X CLI • Python 2.7 • Inconsistent • Poorly documented • Difficult to use • Even more difficult to maintain
  • 5. Project Creation chris@yojimbo:~$ python /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA/project.py Usage: project.py <name> <id> <directory> [iphone,android,mobileweb] [android_sdk] [--update-platforms] Options: -h, --help show this help message and exit -u, --update-platforms Initialize project for any missing platforms. Use this to add a platform to the project without overwriting tiapp.xml and app.js. chris@yojimbo:~$ python /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA/project.py myapp com.mycompany.myapp . foo
  • 6. Build iOS App chris@yojimbo:~$ python /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py builder.py <command> <version> <project_dir> <appid> <name> [options] available commands: install install the app to itunes for testing on iphone simulator build and run on the iphone simulator adhoc build for adhoc distribution distribute build final distribution bundle xcode build from within xcode run build and run app from project folder
  • 7. Build iOS App chris@yojimbo:~$ python /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py simulator [INFO] One moment, building ... Traceback (most recent call last): File "/Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py", line 1594, in <module> main(sys.argv) File "/Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA/iphone/builder.py", line 608, in main iphone_version = dequote(args[2].decode("utf-8")) IndexError: list index out of range builder.py simulator <ios-version> <project-dir> <id> <name> [<device-family> [<sim-type> [<debug-host>]]]
  • 8. OK, We Need A New CLI
  • 9. Building a New CLI • Python 3? Node.js? Ruby? Java+Rhino? • How comfortable are we with these technologies? • Compatible license? • What libraries are available? • XML/JSON parsing • Code minification • Image resizing
  • 10. Appc Node.js • JavaScript! • MIT License • Small size • No native dependencies • Package manager (npm) • Tons of great community modules
  • 12. First Things First • Node.js • 0.8 or newer • NPM
  • 13. Installation npm install -g titanium Note: may need to run as npm sudo
  • 15. Running The CLI chris@yojimbo:~$ titanium Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Usage: titanium <command> [options] Commands: config get and set config options help displays this help screen info display development environment information login logs into the Appcelerator network logout logs out of the Appcelerator network module manages installed Titanium Modules plugin manages installed Titanium Plugins sdk manages installed Titanium SDKs setup run the setup wizard status displays session information Global Flags: --banner, --no-banner displays Titanium version banner [default: true] --colors, --no-colors use colors in the terminal [default: true] -h, --help displays help --prompt, --no-prompt prompt for missing options [default: true] -q, --quiet suppress all output -v, --version displays the current version
  • 16. Help! titanium <cmd> -h chris@yojimbo:~$ titanium help config Titanium Command-Line Interface, version 3.0.10 titanium <cmd> --help Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. titanium help <cmd> Usage: titanium config [--remove] [--output <value>] [<key>] [<value>] Gets and sets config options. If no key is specified, then all key/values are returned. The config file is located at: /Users/chris/.titanium/config.json Config Arguments: <key> the key to get or set <value> the value to set the specified key Config Flags: -r, --remove remove the specified config key and all its descendants Config Options: -o, --output <value> output format [report, json] Global Flags: --banner, --no-banner displays Titanium version banner [default: true] --colors, --no-colors use colors in the terminal [default: true] -h, --help displays help --prompt, --no-prompt prompt for missing options [default: true] -q, --quiet suppress all output -v, --version displays the current version
  • 17. Setup Wizard Basic Setup titanium setup Advanced Setup • Initializes the CLI configuration titanium setup -a chris@yojimbo:~$ titanium setup Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Enter ctrl-c at any time to quit What is your name? (this is used as the default for the "author" field in the tiapp.xml or module manifest file when creating new projects) (Chris Barber) What is your email address used for logging into the Appcelerator Network? (cbarber@appcelerator.com) What would you like as your default locale? (examples: "en", "de", "fr") (en-us) What Titanium SDK would you like to use by default? (2.1.3.GA) Path to your workspace where your projects should be created: (~/appc/workspace) Path to the Android SDK: (this is needed for building Android apps) Configuration saved
  • 18. Manual Configuration Get All Values titanium config Get All User.* • Get and set config settings Settings titanium config user chris@yojimbo:~$ titanium config Set Android SDK Path titanium config android.ndkPath = "/opt/android-ndk" android.sdkPath android.sdkPath = "" “/path/to/sdk” app.idprefix = "com.appcelerator" app.publisher = "Appcelerator" app.sdk = "2.1.3.GA" app.url = "" app.workspace = "~/appc/workspace" cli.colors = true cli.failOnWrongSDK = false cli.logLevel = "trace" cli.prompt = true cli.quiet = false ios.developerName = "Chris Barber" ios.distributionName = "Appcelerator, Inc." paths.commands = [] paths.hooks = [] paths.plugins = ["~/appc/ti.alloy"] user.email = "cbarber@appcelerator.com" user.locale = "en-us" user.name = "Chris Barber"
  • 19. Authentication Logging In chris@yojimbo:~$ titanium login titanium login Titanium Command-Line Interface, version 3.0.10 <username> Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Am I Logged In? titanium status Username: (cbarber@appcelerator.com) Password: Logging out titanium logout Logged in successfully chris@yojimbo:~$ titanium status Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. You are currently logged in as cbarber@appcelerator.com chris@yojimbo:~$ titanium logout Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Logged out successfully • Required for most commands • Adds your app to my.appcelerator.com • Username is your e-mail address
  • 20. System Info chris@yojimbo:~$ titanium info Includes: Titanium Command-Line Interface, version 3.0.10 • OS info Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Operating System • node.js & npm Name Version = Mac OS X = 10.8.2 • Xcode versions Memory = 16.0GB • iOS SDKs & node.js node.js Version = v0.8.12 npm Version = 1.1.63 simulators • iOS provisioning Xcode 4.4.1 (build 4F1003) Install Location = /Applications/Xcode44.app/Contents/Developer profiles & iOS SDKs iOS Simulators = 5.1 = 5.0, 5.1 keychains 4.5 (build 4G182) Install Location = /Applications/Xcode45.app/Contents/Developer • Titanium SDKs iOS SDKs iOS Simulators = 6.0 = 5.0, 5.1, 6.0 • Android SDKs, iOS Certificates Development = Chris Barber (XXXXXXXXXX) addons, and AVDs Distribution = Appcelerator, Inc. Apple WWDR = installed Development iOS Provisioning Profiles Get All Info My Provisioning Profile UUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX titanium info App Prefix App Id = XXXXXXXXXX = com.appcelerator.* iOS Keychains System Default = System Default OS Info Only login.keychain = /Users/chris/Library/Keychains/login.keychain Microsoft_Intermediate_Certificates = /Users/chris/Library/Keychains/Microsoft_Intermediate_Certificates titanium info -t os System.keychain = /Library/Keychains/System.keychain Titanium SDKs 2.1.3.GA iOS Info Only Install Location Platforms = /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA = android, iphone, mobileweb git Hash = unknown titanium info -t ios git Timestamp = unknown Android Platforms android-8 Android & Node.js Name API Level = Android 2.2 =8 Info Only Revision Skins =3 = HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854 titanium info -t ABIs Path = armeabi = /opt/android-sdk/platforms/android-8 android,nodejs Android Add-ons Google Inc.:Google APIs:8 Name = Google APIs Vendor = Google Inc. Output as JSON Revision Description =2 = Android + Google APIs titanium info -o json Skins ABIs = WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA = armeabi Path = /opt/android-sdk/add-ons/addon-google_apis-google-10 Based On = Android 2.2 (API level 8) Libraries = com.google.android.maps: API for Google Maps (maps.jar)
  • 21. Modules & Plugins Get Installed Modules chris@yojimbo:~$ titanium module titanium module Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Get Installed Modules Including a Project titanium module Global Modules –project-dir /path/to/project Android ti.cloudpush 2.0.7 /Users/chris/Library/Application Support/Titanium/modules/android/ti.cloudpush/2.0.7 CommonJS ti.cloud commonjs/ti.cloud/2.2.0 2.3.0 /Users/chris/Library/Application Support/Titanium/modules/commonjs/ti.cloud/2.3.0 2.0.5 /Library/Application Support/Titanium/modules/commonjs/ti.cloud/2.0.5 iPhone ti.jira 1.0 /Users/chris/Library/Application Support/Titanium/modules/iphone/ti.jira/1.0 Mobile Web ti.oldmodule 0.1 /Users/chris/Library/Application Support/Titanium/modules/mobileweb/ti.oldmodule/0.1
  • 22. Modules & Plugins Get Installed Plugins titanium plugin Output as JSON titanium plugin chris@yojimbo:~$ titanium plugin -o json Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. User Path Plugins No project plugins found Global Plugins another_plugin 1.0 /Users/chris/Library/Application Support/Titanium/plugins/another_plugin/1.0 test_plugin 1.0 /Users/chris/Library/Application Support/Titanium/plugins/test_plugin/1.0 ti.alloy 1.0 /Users/chris/Library/Application Support/Titanium/plugins/ti.alloy/1.0
  • 23. Wait a sec… Where’s the create and build commands?
  • 24. Downloading An SDK List Intalled SDKs chris@yojimbo:~$ titanium sdk titanium sdk Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Install Latest 3.0 titanium sdk install --branch 3_0_X Installed SDKs: --default 2.1.3.GA [default] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.3.GA 2.1.2.GA /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.2.GA Install Latest Stable 2.1.0.GA /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.1.0.GA titanium sdk install 2.0.2.GA /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA Install Latest Stable & Set as Default SDK titanium sdk install --default Install Bleeding Edge chris@yojimbo:~$ titanium sdk install --branch 3_0_X --default titanium sdk install Titanium Command-Line Interface, version 3.0.10 --branch master Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Downloading http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_0_X/mobilesdk- 3.0.0.v20121018214614-osx.zip 100% [=================================================================] 0.0s Extracting SDK... Saving SDK 3.0.0.v20121018214614 as the default. Titanium SDK 3.0.0.v20121018214614 successfully installed!
  • 25. New Commands! chris@yojimbo:~$ titanium Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Usage: titanium <command> [options] Commands: build builds a project clean removes previous build directories config get and set config options create creates a new mobile application or module help displays this help screen info display development environment information login logs into the Appcelerator network logout logs out of the Appcelerator network module manages installed Titanium Modules plugin manages installed Titanium Plugins project get and set tiapp.xml settings sdk manages installed Titanium SDKs setup run the setup wizard status displays session information Global Flags: --banner, --no-banner displays Titanium version banner [default: true] --colors, --no-colors use colors in the terminal [default: true] -h, --help displays help --prompt, --no-prompt prompt for missing options [default: true] -q, --quiet suppress all output -v, --version displays the current version
  • 27. Creating a Project Create a Project chris@yojimbo:~$ titanium create titanium create Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Create Project With All Arguments titanium sdk create Target platforms: (android,ios,ipad,iphone,mobileweb) --id com.appc.myapp App ID: com.appcelerator.myapp --name myapp Project name: myapp --platforms android,iphone,ipad, [INFO] Creating Titanium Mobile application project mobileweb [DEBUG] Copying /Users/chris/Library/Application --workspace-dir Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default => /path/to/workspace /Users/chris/myapp [DEBUG] Copying /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources => /Users/chris/myapp/Resources [DEBUG] Copying /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources/a ndroid => /Users/chris/myapp/Resources/android [DEBUG] Copying /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources/a ndroid/images => /Users/chris/myapp/Resources/android/images [DEBUG] Copying /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.0.0.v20121018214614/android/templates/app/default/Resources/a ndroid/images/res-notlong-port-mdpi => /Users/chris/myapp/Resources/android/images/res- notlong-port-mdpi [INFO] Project 'myapp' created successfully in 32ms
  • 28. Getting Project Info Basic Info titanium project Copy Platform • Tool for interacting with the tiapp.xml Resource Files titanium project chris@yojimbo:~/myapp$ titanium project --deployment-targets Titanium Command-Line Interface, version 3.0.10 android,ios,mobileweb Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. Deployment Targets: android = true ipad = false iphone = true mobileweb = true Project Properties: sdk-version = 3.0.0 id = com.appcelerator.myapp name = myapp version = 1.0 publisher = not specified url = not specified description = not specified copyright = not specified icon = appicon.png analytics = true guid = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • 29. Building a Project Platforms: chris@yojimbo:~/myapp$ titanium build --platform ios • iOS Titanium Command-Line Interface, version 3.0.10 • Mobile Web Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. • Android [DEBUG] No project level plugins to load [DEBUG] Loaded plugin hooks: Special Hooks: [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/cli/hooks/plugins.js • Run in Simulator [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone/cli/hooks/install.js • Install on Device [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone/cli/hooks/package.js [DEBUG] /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone/cli/hooks/run.js • Package for [INFO] Build type: development Distribution [DEBUG] Titanium iOS SDK directory: /Users/chris/Library/Application Support/Titanium/mobilesdk/osx/3.1.0/iphone [INFO] Building for target: simulator [INFO] Building using iOS SDK: 6.0 [INFO] Building for iOS Simulator: 6.0 [INFO] Building for device family: universal [DEBUG] Setting Xcode target to Debug [DEBUG] Setting Xcode build OS to iphonesimulator6.0 [DEBUG] Xcode installation: /Applications/Xcode45.app/Contents/Developer [DEBUG] iOS WWDR certificate: installed [INFO] Building for iOS 6.0; using 4.3 as minimum iOS version [DEBUG] Minimum iOS version: 4.3 [INFO] Debugging disabled [DEBUG] Building for the following architectures: armv7 armv7s i386 [DEBUG] Forcing rebuild: githash changed since last build [DEBUG] Was: a50c927 [DEBUG] Now: ab2b280 [INFO] Cleaning old build directory [DEBUG] Would be firing "compile" legacy plugin hook if it was supported [INFO] Building Info.plist [INFO] No Titanium Modules required, continuing [INFO] Performing full rebuild [INFO] Copying Xcode iOS files ...
  • 30. Cleaning the Project Nuke All Platform Build Directories titanium clean • Completely removes the platform specific build Nuke a Specific Platform’s Build directories Directory titanium clean –platform android chris@yojimbo:~/myapp$ titanium clean Titanium Command-Line Interface, version 3.0.10 Copyright (c) 2012, Appcelerator, Inc. All Rights Reserved. [INFO] Project cleaned successfully in 1ms
  • 31. Extending the CLI Plugins, commands, and hooks
  • 32. Plugins • Similar to Titanium Modules • Legacy plugin.py not supported today • CLI commands & hooks • Installed globally or in project directory • Enabled via the tiapp.xml <plugins>
  • 33. Sample Command myplugin/1.0/cli/com exports.cliVersion = '>=3.X'; mands/magic.js exports.desc = 'does magical things’; exports.config = function (logger, config, cli) { return { flags: { extra: { abbr: 'e', desc: 'adds more magic’ } } }; }; exports.validate = function (logger, config, cli) { // nothing to validate }; exports.run = function (logger, config, cli) { var s = 'doing magical stuff!'; if (cli.argv.extra) { s = s.replace(/./g, function (c, i) { return i % 2 == 0 ? c.toUpperCase() : c.toLowerCase(); }); } logger.log(s); };
  • 34. Sample Hook myplugin/1.0/cli/hook s/my_build_hook.js exports.cliVersion = '>=3.X'; exports.init = function (logger, config, cli) { cli.addHook('build.pre.compile', function (data, finished) { logger.log('modifying some code before build starts'); finished(); }); cli.addHook('build.post.compile', { priority: 900, post: function (data, finished) { logger.log('packaging some extra files after the build'); finished(); } }); cli.addHook('build.finalize', function (data, finished) { logger.log('cleaning up my mess'); finished(); }); };
  • 35. Demo Kick the tires & light the fires
  • 37. // TODO: • More plugin hooks • Project creation, chaging project settings, etc • Project exporting & migration tools • Better support for multiple Titanium SDKs • What would you like to see?
  • 38. Summary Just in case you were sleeping
  • 39. The New CLI Rocks • Easy to install, easy to use • Fast as shit • Built-in documentation • Extensible plugin architecture • Consistent arguments • Argument prompting • Internationalization • Colors!
  • 40. Get It Today! npm install -g titanium titanium sdk install --branch 3_0_X --default Note: may need to run npm as sudo
  • 41. Chris Barber @cb1kenobi cbarber@appcelerator.com

Editor's Notes

  1. Who’s actually used the Python build scripts?
  2. Who’s actually used the Python build scripts?
  3. Just like ti studio