在Cordova 5.4.0及更高版本中,after_prepare挂钩文件修改失败

时间:2016-04-07 21:30:28

标签: cordova

我有一个after_prepare挂钩,用我应用程序的主要javascript文件中的环境设置替换了一些占位符。它在Cordova 5.3.3及更低版本中运行良好,但从Cordova 5.4.0开始,对文件的更改在进入我的应用程序时就会撤消。当我重新读取钩子中的文件时,它看起来成功写入,但是当我在应用程序运行后打开文件时它已经恢复。

该文件为platforms/ios/www/static/angular/js/my-angular-stuff.js。 我使用的是hooks/after_prepare/文件夹,但由于它已被弃用,我尝试使用config.xml设置。我也开始使用Cordova推荐的module.exports = function(context) {风格;这些似乎都没有任何区别。同样,脚本似乎运行得很好,并确认更改已正确写入。但是之后的事情就会消除这些变化。

我很高兴使用不是after_prepare的钩子,如果有更合适的话。 TBH我没有牢牢掌握各种Cordova执行阶段(构建vs编译vs准备vs运行)。

2 个答案:

答案 0 :(得分:1)

我记得当我切换到cordova 6时,我必须在钩子中重构很多东西,但我不记得到底是什么......

如果它有帮助,这里'我拥有的仍然适用于6.1:

这是一个特定于android的钩子,所以它在config.xml的android平台部分:

    <platform name="android">
        <preference name="AndroidLaunchMode" value="singleTop" />
        <preference name="android-minSdkVersion" value="14" />
        <preference name="KeepRunning" value="true"/>
        <icon src="res/android/xhdpi.png" />
        <icon density="ldpi" src="res/android/ldpi.png" />
        <icon density="mdpi" src="res/android/mdpi.png" />
        <icon density="hdpi" src="res/android/hdpi.png" />
        <icon density="xhdpi" src="res/android/xhdpi.png" />
        <hook type="after_prepare" src="scripts/android/myhookname.js" />
        <hook type="after_platform_add" src="scripts/android/anotherhook.js" />
...
    </platform>

...

,myhookname.js看起来像这样:

        #!/usr/bin/env node
    module.exports = function(ctx) {
        var fs = ctx.requireCordovaModule('fs'),
            path = ctx.requireCordovaModule('path'),
            xml = ctx.requireCordovaModule('cordova-common').xmlHelpers;

        var manifestPath = path.join(ctx.opts.projectRoot, 'platforms/android/AndroidManifest.xml');
        var doc = xml.parseElementtreeSync(manifestPath);
        if (doc.getroot().tag !== 'manifest') {
            throw new Error(manifestPath + ' has incorrect root node name (expected "manifest")');
        }

        //change the theme in Android manifest file
        doc.getroot().find('./application/activity[@android:name="MainActivity"]').attrib['android:theme'] = '@android:style/Theme.DeviceDefault.Light';

        //save the file
        fs.writeFileSync(manifestPath, doc.write({indent: 4}), 'utf-8');
            console.log('\nEnd of post-prepare hook');
}

但我没有ios钩子,也许你的问题是特定于平台或者是cordova ios中的一个bug,你试过升级到最新版的cordova ios吗?

我也使用钩子来修改原生文件,而不是www中的文件,所以如果我在www中修补文件,也许我会遇到同样的问题。

要修补www中的js文件,我使用 merges 文件夹,我在每个平台上放置特定的js文件。

答案 1 :(得分:0)

我试图修改我的iOS项目文件,并且在after_prepare他无法正常工作时遇到类似的问题。我最终选择了after_plugin_install。对于我的情况,效果不是很好,但是是可行的解决方案。