我有一个由应用程序链接的静态库。库代码打开一个文件,该文件位于应用程序包中的bundle中,开头完成如下:
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
这很好。
但是我想在库中添加一些单元测试代码,因此我有一个逻辑测试目标。由于文件位于应用程序的包中而不是静态库的包中,因此我复制了Config.plist
文件,并通过Copy Bundle Resources
将其添加到测试代码目标中。但是,当我执行测试代码时,无法找到该文件。那是为什么?
由于以上是令人困惑的,这里是工作区结构的摘要。
Workspace contains:
Application Project with application target, which contains (X)
Config.plist (a)
Library project which contains:
Library target, which contains:
the code opening the file in the bundle (b)
Test library target, which contains: (Y)
A Copy of the Config.plist (c)
所以,如果我构建X,那么当b运行时,它可以找到一个。但是当我在运行时构建Y然后b找不到c。
答案 0 :(得分:11)
我发现如果我将[Bundle mainBundle]更改为[NSBundle bundleForClass:[self class]],那么它在两种情况下都有效
答案 1 :(得分:0)
您可以在项目库中创建应用程序目标,将该文件复制到该目标,然后在测试库代码的位置创建一个应用程序测试目标(在同一项目中)。
答案 2 :(得分:0)
问题是静态库没有捆绑资源。编译后,它将只包含已编译的代码和头文件。因此,没有要复制的静态库plist资源。
因此,您需要另一个进程来复制库包,使其最终位于构建目录中。
我找到的最有效的方法是在Link Binary With Libraries阶段之前的运行脚本阶段使用脚本执行此操作。我附上了我的一个项目的截图,我必须做类似的事情。您应该能够通过在脚本的第一行调整文件名来实现所需的功能。所有环境变量都是预定义的标准,所以我认为除了这个脚本之外还不需要任何进一步的配置。
尚未测试环境变量是否适用于除默认xCode 4构建位置以外的任何其他内容。