[Swift] R.swiftを導入しようとしたら、Command PhaseScriptExecution failed with a nonzero exit code と出た時

ITSwift

[検証環境]
Xcode 10.2.1
Swift 5.0.1
cocoapod 1.6.1

結論からいいますと、公式ドキュメントの手順(https://github.com/mac-cain13/R.swift#manually) 「Run Script」で Shell を書く箇所を

"$SRCROOT/rswift" generate "$SRCROOT/R.generated.swift"

"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift"

にすると成功し、プロジェクト直下に R.generated.swift が作成されます。

ドキュメントに書いてあるシェルを書いてビルドした際のエラーを読むと、

line 2: /Users/[username]/Documents/xcode/[project_name]/rswift: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code

とはかれていて、rswift がないと言ってます。

cocoapod を使用しているのですが、rswift があるディレクトリは 「Pod/R.swift/rswift」です。

なので、シェルのパス指定を “$SRCROOT/rswift” から “$PODS_ROOT/R.swift/rswift” に変えてやることでうまくいきました。

「Build Phase」の設定箇所で「Input Files」「Output Files」も設定する必要があります。

ちなみに R.generate.swift は下記のような構造体です。
リソースを追加するたびにビルドし直す必要がありますね

R.generate.swift
//
// This is a generated file, do not edit!
// Generated by R.swift, see https://github.com/mac-cain13/R.swift
//

import Foundation
import Rswift
import UIKit

/// This `R` struct is generated and contains references to static resources.
struct R: Rswift.Validatable {
  fileprivate static let applicationLocale = hostingBundle.preferredLocalizations.first.flatMap(Locale.init) ?? Locale.current
  fileprivate static let hostingBundle = Bundle(for: R.Class.self)
  
  static func validate() throws {
    try intern.validate()
  }
  
  /// This `R.image` struct is generated, and contains static references to 3 images.
  struct image {
    /// Image `checkmark`.
    static let checkmark = Rswift.ImageResource(bundle: R.hostingBundle, name: "checkmark")
    /// Image `gallery`.
    static let gallery = Rswift.ImageResource(bundle: R.hostingBundle, name: "gallery")
    /// Image `rotate`.
    static let rotate = Rswift.ImageResource(bundle: R.hostingBundle, name: "rotate")
    
    /// `UIImage(named: "checkmark", bundle: ..., traitCollection: ...)`
    static func checkmark(compatibleWith traitCollection: UIKit.UITraitCollection? = nil) -> UIKit.UIImage? {
      return UIKit.UIImage(resource: R.image.checkmark, compatibleWith: traitCollection)
    }
    
    /// `UIImage(named: "gallery", bundle: ..., traitCollection: ...)`
    static func gallery(compatibleWith traitCollection: UIKit.UITraitCollection? = nil) -> UIKit.UIImage? {
      return UIKit.UIImage(resource: R.image.gallery, compatibleWith: traitCollection)
    }
    
    /// `UIImage(named: "rotate", bundle: ..., traitCollection: ...)`
    static func rotate(compatibleWith traitCollection: UIKit.UITraitCollection? = nil) -> UIKit.UIImage? {
      return UIKit.UIImage(resource: R.image.rotate, compatibleWith: traitCollection)
    }
    
    fileprivate init() {}
  }

参考:
【Swift】R.swiftが優秀すぎるので紹介してみる
R.swift

以上になります。

スポンサーリンク

Posted by nobuhiro harada