Skip to content

Instantly share code, notes, and snippets.

@naokits
Last active August 29, 2015 14:08
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save naokits/5e202549d0fc96f3e3c6 to your computer and use it in GitHub Desktop.
Save naokits/5e202549d0fc96f3e3c6 to your computer and use it in GitHub Desktop.
XcodeプロジェクトをビルドしてIPAファイルを生成するだけのSwiftスクリプト?
#!/usr/bin/swift
//
// ipa_generator.swift
//
// Created by Naoki Tsutsui on 2014/10/29.
// Copyright (c) 2014年 Naoki Tsutsui All rights reserved.
//
/*
プロジェクト(workspaceのみに対応)ビルドし、IPAファイルを指定したディレクトリに作成します。
使用方法
1. このSwiftファイルを、 Xcodeプロジェクトのルートディレクトリに設置します。
2. PokkeBuilderの各プロパティに適切な値をセットします。
3. ターミナルで、 ./project_builder.swift を実行します。実行権が外れている場合は、chmod で実行権を付与してください。
例) ./main.swift -build debug -path /path/to/your-project
注意事項
理由はよくわかりませんが、actoolというコマンドが、Asset Catalogにある画像を生成してくれません。
なので、「AppIcon60x60@2x.png」のようなファイルがアプリ内に無い状態になるのでご注意ください。
引数のチェックは適当ですので、オプショナル関係でエラーが出る場合があるかもしれません。
*/
import Foundation
class PokkeBuilder {
let WORKSPACE_NAME = "hoge.xcworkspace"
let SCHEME = "hoge-dev"
let CONFIGURATION = "AdHocDev"
let TARGET_NAME = "hoge"
let SDK = "iphoneos8.1"
let PRODUCT_NAME = "hoge.app"
let IPA_FILE_NAME = "hoge.ipa"
let OUT_IPA_DIR = "OUT_IPA_DIR"
var projectPath: String! // プロジェクトのルートパス
func workspacePath() -> String {
return projectPath + "/" + WORKSPACE_NAME
}
func outputPath() -> String {
return projectPath + "/" + OUT_IPA_DIR
}
func appFilePath() -> String {
return self.outputPath() + "/" + PRODUCT_NAME
}
func IPAFilePath() -> String {
return self.outputPath() + "/" + IPA_FILE_NAME
}
func clean() {
let task : NSTask = NSTask()
task.launchPath = "/usr/bin/xcodebuild"
task.arguments = ["clean", "-workspace", self.workspacePath(), "-scheme", SCHEME]
task.standardInput = NSFileHandle.fileHandleWithNullDevice()
task.standardError = NSFileHandle.fileHandleWithStandardError()
task.standardOutput = NSFileHandle.fileHandleWithStandardOutput()
task.launch()
task.waitUntilExit()
}
func build() {
let task : NSTask = NSTask()
task.launchPath = "/usr/bin/xcodebuild"
task.arguments = ["-workspace", self.workspacePath(), "-scheme", SCHEME, "-sdk", SDK, "-configuration", CONFIGURATION, "CONFIGURATION_BUILD_DIR=\(self.outputPath())"]
task.standardInput = NSFileHandle.fileHandleWithNullDevice()
task.standardError = NSFileHandle.fileHandleWithStandardError()
task.standardOutput = NSFileHandle.fileHandleWithStandardOutput()
task.launch()
task.waitUntilExit()
}
/*
Create ipa File
*/
func createIPA() {
let task : NSTask = NSTask()
task.launchPath = "/usr/bin/xcrun"
task.arguments = ["-sdk", SDK, "PackageApplication", self.appFilePath(), "-o", self.IPAFilePath()]
task.standardInput = NSFileHandle.fileHandleWithNullDevice()
task.standardError = NSFileHandle.fileHandleWithStandardError()
task.standardOutput = NSFileHandle.fileHandleWithStandardOutput()
task.launch()
task.waitUntilExit()
}
func usage() {
println("使用方法を表示する")
}
}
///////////////////////////////////////////////////////////////////////////////
// Main処理
///////////////////////////////////////////////////////////////////////////////
let builder = PokkeBuilder()
let debugmode: Bool = true
let arguments = NSProcessInfo.processInfo().arguments as NSArray
let argv0 = arguments[0] as String
let appName = argv0.lastPathComponent
println("App: \(appName)")
// -helpが含まれている場合は、使用法を表示して終了
let predicate = NSPredicate(format:"SELF beginswith '-help'", argumentArray:nil)
if let helpArguments = arguments.filteredArrayUsingPredicate(predicate) as? [NSString] {
if (helpArguments.count > 0) {
builder.usage()
exit(1)
}
}
var buildType: String!
var projectPath: String!
// 引数を '-' 毎に切り分けて配列に格納する
if let dashedArguments = (arguments as Array).filter({$0.hasPrefix("-")}) as? [NSString] {
for argument: NSString in dashedArguments {
let key = argument.substringFromIndex(1) as String
if let value = NSUserDefaults.standardUserDefaults().valueForKey(key) as? String {
if debugmode {
println("引数: \(argument)")
println("キー: \(key)")
println("値: \(value)")
}
if (argument == "-build") {
if value == "debug" {
println("pokke devを作成します")
} else if value == "production" {
println("pokke prodを作成します")
}
buildType = value
} else if argument == "-m" {
println("コメント: \(value)")
} else if argument == "-path" {
let path = value
println("\(path)")
projectPath = path
}
}
}
}
if projectPath == nil {
println("パスの指定は必須です")
} else {
builder.projectPath = projectPath
builder.clean()
builder.build()
builder.createIPA()
}
println("-------------- 終了 --------------")
@naokits
Copy link
Author

naokits commented Oct 30, 2014

似たようなことをするシェルスクリプトは次にあります。

https://gist.github.com/naokits/691f1749afcd0d3b055f

こちらは正常にDeployGateにアップロードまでできます

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment