使用编译器指令在文件丢失时发出警告

Posted

技术标签:

【中文标题】使用编译器指令在文件丢失时发出警告【英文标题】:Using compiler directive to warn if a file is missing 【发布时间】:2017-02-21 20:47:26 【问题描述】:

我有一个包含在捆绑包中的文件,其名称如下:

databaseX.sqlite

其中 X 是应用的版本。如果版本为 2.8,则文件应命名为 database2.8.sqlite。当应用程序提交给 Apple 时,我必须确保包含此文件。

是否可以创建编译器指令来检查文件是否在包中?

我试过了,没有成功

#define fileInBundle [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"LoteriaMac%@.sqlite", [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"]]]

#if defined(fileInBundle)
#pragma message("file in bundle")
#else
#pragma message("file missing")
#endif

file in bundle 始终显示,即使文件不在捆绑包中。

【问题讨论】:

【参考方案1】:

这是不可能的。您正在尝试在编译指令中使用运行时检查。

一般来说,在编译时,您无法知道包中是否有文件,因为文件通常在编译后独立于代码添加到包中。

这与编译时检查另一台计算机的文件系统中是否存在文件相同。

要在构建期间检查,您可以在目标中创建自定义构建脚本(构建阶段 => + 按钮),类似于:

APP_PATH="$TARGET_BUILD_DIR/$WRAPPER_NAME"

// there is probably some easier way to get the version than from the Info.plist
INFO_FILE="$APP_PATH/Info.plist"
VERSION=`/usr/libexec/plistbuddy -c Print:CFBundleShortVersionString "$INFO_FILE"`

// the file we want to exist
DB_FILE="$APP_PATH/database$VERSION.sqlite"

// if the file does not exist
if [ ! -f "$DB_FILE" ]; then
   // emit an error 
   echo "error: File \"$DB_FILE\" not found!" >&2;
   // and stop the build
   exit 1
fi

【讨论】:

既然是在“提交”之前,这可以在编译时在脚本中完成吗?当然,另一个人可以删除它。 @Larme 你可以在构建或构建后脚本中做任何事情。 @Sulthan - 你知道如何在构建阶段使用脚本吗? @SpaceDog 我已经添加了一个示例脚本,可能可以简化或者可能需要一些小的改动。简而言之,它只是在文件存在时查看应用程序。 当我按下 (+) 时,看到了 3 个选项 New copy files phasenew run script phasenew headers phase。我想正确的是第二个。我选择了那个,但脚本总是打印这个:Print: Entry, ":CFBundleShortVersionString", Does Not Exist,然后一行告诉我文件Info.plist.sqlite(?)找不到...

以上是关于使用编译器指令在文件丢失时发出警告的主要内容,如果未能解决你的问题,请参考以下文章

阿波罗的 MockedProvider 没有明确警告丢失的模拟

警告 Pod 中丢失的文件

为什么分配可能会丢失数据而不会产生编译器警告

当我尝试编译我的程序时,GTKmm 头文件似乎丢失了

RxAlamofire - 下载完成的事件丢失

proguard.cfg 文件丢失