从编译的代码中找到Swift中的源项目目录

时间:2014-07-25 00:15:44

标签: xcode swift

我想在我自己的swift项目中找到未编译源代码的目录(因为我想计算它的行​​数)。

let projectRepo = "/Users/tombrown/Workspace/SwiftGolf" // <-- I want this programmatically
let path = "\(projectRepo)/SwiftGolf/Golf.swift"

var fileContents = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)

我找到了NSBundle.mainBundle().bundlePath的编译位置,但它不包含未编译的代码。有什么想法吗?也许有一种方法可以在构建过程中编写临时文件?

2 个答案:

答案 0 :(得分:2)

挑战是在运行时与编译时间之间快速推断位置。 xcode建议中的参数运行良好,可以作为解决方案接受。我无法使用这种方法,因为我在没有xcode的情况下使用SPM。另一种方法可能是使用此库https://github.com/JohnSundell/Files

你在Package.swift中的

dependencies: [
          .Package(url: "https://github.com/JohnSundell/Files.git", Version(1,8,0))
    ]

然后在你的代码中

import Files
let projectRepo = "\(Folder.home.path)/gitWorkspace/SwiftGolf"
do {
 let model = try Data(contentsOf:URL(fileURLWithPath: "\(projectDir)/\(modelFile)"))

}catch {

   print("error: \(error)")

}

另一个选项是CommandLineKit / xcode参数

import CommandLineKit .  
let cmdLine = CommandLineKit.CommandLine() .    
let file = StringOption(shortFlag: "f",   
                    longFlag: "file",    
                    required: true,   
                    helpMessage: "The file you're trying to parse") .   
cmdLine.addOptions(file)


do {
    try cmdLine.parse()
    print(file.value!)   
} catch {
    print("error: \(error)")
    exit(-1)
}

enter image description here

答案 1 :(得分:1)

由于将源文件添加到Build Phases > Copy Bundle Resources并不起作用并且具有更大的灵活性,我建议使用一点点Objective-C。

在项目Build Settings中添加以下内容:

steps to add a macro

然后如果你的项目已经有一个桥接头,那么const将从Swift自动获得

do {
    let path = "\(PROJECT_DIR)/Test/ViewController.swift"
    let source = try String(contentsOfFile: path)
    print(source)
} catch {
    print("Error handling goes here")
}

如果项目没有桥接标题,则可以通过向项目添加新的Objective-C类来使Xcode添加一个,然后Xcode会询问桥接标题。 / p>

编辑:

当然,也可以通过向项目添加新的头文件,然后将其路径设置为&#34; Objective-C Bridging Header&#34;来手动添加桥接头。在项目的构建设置中。

通常PROJECT_DIR宏不会自动提供给Swift代码,在桥接头中添加:

@import Foundation;

static const NSString *kProjectDir = PROJECT_DIR;

结束编辑

如果您对文件的只读访问权限很好,您可以通过添加自定义脚本或Copy Files构建阶段来使Xcode将源文件复制到应用程序的资源文件夹中:

steps to add copy files phase

然后文件的路径为:

let path = NSBundle.mainBundle().pathForResource("ViewController", ofType: "swift")