我想在"标题搜索路径"下添加一个新条目。一旦我的Cordova插件被添加到Xcode项目中。
如何在Cordova plugin.xml文件中配置它?
感谢。
答案 0 :(得分:3)
据我所知,在整个项目范围内无法做到这一点。
但是,有一种方法可以为每个源文件添加搜索路径,从而完成相同的操作。 plugin.xml中的source-file
元素支持compiler-flags
属性。对于此属性,您可以添加编译器(在本例中为clang
命令)支持的任何标志。要添加到标头搜索路径的编译器标志是-I<path>
。请注意,如果您包含空格(例如-I <path>
),Cordova将生成格式错误的.xcodeproj
文件夹,您将无法在Xcode中打开项目,也无法从命令行构建Cordova项目。另请注意,在这种情况下,<path>
与Cordova生成的.xcodeproj
文件夹相关。
所以,例如,如果你的插件文件夹中有这些文件(让我们称之为〜/ com.MyPlugin /):
myAngleHeader.h
mySource.m
mySource.h
其中mySource.h
包含行#include <myAngleHeader.h>
mySource.m
包含第#include "mySource.h"
行
然后你想要放入你的plugin.xml(〜/ com.MyPlugin / plugin.xml):
<source-file src="myAngleHeader.h" />
<source-file src="mySource.h" />
<source-file src="mySource.m" compiler-flags="-ImyApp/Plugins/com.MyPlugin/" />
其中&#34; myApp&#34;是您的Cordova项目的名称。请再次注意,-I
标志后必须没有空格。
遗憾的是,此方法要求开发人员控制插件和Cordova项目。如果你想发布一个供所有人使用的插件,它将不会非常有用。可能有更好的方法来做到这一点;我很乐意听到其他解决方案。
希望有所帮助!
答案 1 :(得分:2)
我想通过配置更新我的标题搜索路径,因为它始终是在构建日设置它的手动任务。我已经添加了这个插件:
然后我可以将这些添加到我的配置中,并且不必再担心它。
<platform name="ios">
<!-- Set orientation on iPhone -->
<config-file platform="ios" target="*-Info.plist" parent="UISupportedInterfaceOrientations">
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
</config-file>
<!-- Set orientation on iPad -->
<config-file platform="ios" target="*-Info.plist" parent="UISupportedInterfaceOrientations~ipad">
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</config-file>
<!-- Set Header Search Paths-->
<preference name="ios-XCBuildConfiguration-HEADER\_SEARCH\_PATHS" value="'$(TARGET_BUILD_DIR)/usr/local/lib/include' '$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include' '$(BUILT_PRODUCTS_DIR)'" buildType="release" xcconfigEnforce="true" />
答案 2 :(得分:1)
@JohnWalthour
我需要为我正在创建的cordova插件执行此操作,并且可以使用"after plugin install"挂钩。我意识到我可以在安装后运行node.js脚本并修改HEADER_SEARCH_PATHS
中的${project}/platforms/ios/cordova/build.xcconfig
。
它需要变脏,但效果很好。这项工作的一个关键部分是,在info.plist中将Bundle名称分配给${PRODUCT_NAME}
,这样您就可以在${PRODUCT_NAME}
中使用build.xcconfig
,它会插入您的项目/应用名称。 Cordova已经为您设置了${PRODUCT_NAME}
变量。
以下是相关代码 -
plugin.xml(简洁和重要的缩写)
<platform name="ios">
.....
<hook type="after_plugin_install" src="hooks/AfterPluginInstall.js" />
<hook type="before_plugin_uninstall" src="hooks/BeforePluginUninstall.js" />
.....
</platform>
AfterPluginInstall.js
#!/usr/bin/env node
'use strict';
let cwd = process.cwd();
let fs = require('fs');
let path = require('path');
console.log('InstagramAssetsPicker AfterPluginInstall.js, attempting to modify build.xcconfig');
let xcConfigBuildFilePath = path.join(cwd, 'platforms', 'ios', 'cordova', 'build.xcconfig');
console.log('xcConfigBuildFilePath: ', xcConfigBuildFilePath);
let lines = fs.readFileSync(xcConfigBuildFilePath, 'utf8').split('\n');
let headerSearchPathLineNumber;
lines.forEach((l, i) => {
if (l.indexOf('HEADER_SEARCH_PATHS') > -1) {
headerSearchPathLineNumber = i;
}
});
if (lines[headerSearchPathLineNumber].indexOf('InstagramAssetsPicker') > -1) {
console.log('build.xcconfig already setup for InstagramAssetsPicker');
return;
}
lines[headerSearchPathLineNumber] += ' "$(SRCROOT)/$(PRODUCT_NAME)/cordova-plugin-InstagramAssetsPicker/GPUImageHeaders"';
let newConfig = lines.join('\n');
fs.writeFile(xcConfigBuildFilePath, newConfig, function (err) {
if (err) {
console.log('error updating build.xcconfig, err: ', err);
return;
}
console.log('successfully updated HEADER_SEARCH_PATHS in build.xcconfig');
});
BeforePluginUninstall.js
#!/usr/bin/env node
'use strict';
let cwd = process.cwd();
let fs = require('fs');
let path = require('path');
console.log('InstagramAssetsPicker BeforePluginInstall.js, attempting to modify build.xcconfig');
let xcConfigBuildFilePath = path.join(cwd, 'platforms', 'ios', 'cordova', 'build.xcconfig');
console.log('xcConfigBuildFilePath: ', xcConfigBuildFilePath);
let lines = fs.readFileSync(xcConfigBuildFilePath, 'utf8').split('\n');
let headerSearchPathLineNumber;
lines.forEach((l, i) => {
if (l.indexOf('HEADER_SEARCH_PATHS') > -1) {
headerSearchPathLineNumber = i;
}
});
if (lines[headerSearchPathLineNumber].indexOf('InstagramAssetsPicker') === -1) {
console.log('build.xcconfig does not have header path for InstagramAssetsPicker.');
return;
}
let line = lines[headerSearchPathLineNumber];
lines[headerSearchPathLineNumber] = line.replace(/\ "\$\(SRCROOT\)\/\$\(PRODUCT_NAME\)\/cordova-plugin-InstagramAssetsPicker\/GPUImageHeaders\"/i, '');
let newConfig = lines.join('\n');
fs.writeFile(xcConfigBuildFilePath, newConfig, function (err) {
if (err) {
console.log('error updating build.xcconfig, err: ', err);
return;
}
console.log('successfully updated HEADER_SEARCH_PATHS in build.xcconfig');
});