Open3

CI/CDで Swift を使いたいのでなんとかする

kamimikamimi

Swift で Shell コマンドを実行したい

import Foundation

// - seealso: https://stackoverflow.com/a/50035059/18519539
@discardableResult // Add to suppress warnings when you don't want/need a result
func safeShell(_ command: String) throws -> String {
    let task = Process()
    let pipe = Pipe()
    
    task.standardOutput = pipe
    task.standardError = pipe
    task.arguments = ["-c", command]
    task.executableURL = URL(fileURLWithPath: "/bin/zsh") //<--updated
    task.standardInput = nil

    try task.run() //<--updated
    
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: .utf8)!
    
    return output
}

使い方

// 戻り値を使用しない場合
try safeShell("git tag v10.99.0")

// 戻り値を使用する場合
let result = try safeShell("ls")
print(result)

https://stackoverflow.com/a/50035059/18519539

kamimikamimi

Ruby(具体的には fastlane )から Swiftを実行したい

lane :test do
  system("swift hello.swift")
end
kamimikamimi

Swift ファイルを実行するときに変数を渡したい

環境変数で渡す

呼び出し元

lane :test do
  system("swift hello.swift")
end
KEY=TEST bundle exec fastlane test

呼び出される側

let envArgs = ProcessInfo.processInfo.environment
precondition(envArgs["TAG"] != nil)  // 必須の環境変数があればここでチェック

let value = envArgs["KEY"]!
print(value)  // test

引数で渡す

呼び出し元

lane :test do
  system("swift hello.swift test")
end
bundle exec fastlane test

呼び出される側

precondition(CommandLine.argc == 2)  // 引数の数をチェックする(実行する swift ファイル自体も含まれる)
let result = CommandLine.arguments[1]

print(result)  // test