cordova代码被初始化

NeoChang
  • 1.4k

问题很简单。我用cordova 然后我每次添加插件,源码就被初始化成为最初的代码了。这是什么原因啊?我百度没找到。
cordova build 和 cordova install 都会导致代码初始化。

回复
阅读 3.9k
2 个回答
✓ 已被采纳

你好,你说的初始化,大概是不是指(我们拿 android 来举例):

  1. 你是手动替换 android 的 assets 里的 www 目录。

  2. 接着你运行了 cordova build 命令,然后运行的效果,变成了 Hello cordova(类似 Hello world)

如果是这样,我们先来分析 cordova build 命令。

我们在命令行里面使用的 cordova 一般是指 cordova-cli

cordova-cli 是基于 nodejs 写的脚本。

cordova-cli 的目录结构如下。
clipboard.png

我们进入cli.js 文件。
在这里,我们可以看到这样的代码

    ...
    if (cmd == 'emulate' || cmd == 'build' || cmd == 'prepare' || cmd == 'compile' || cmd == 'run') {
        // All options without dashes are assumed to be platform names
        ...
        cordova.raw[cmd].call(null, opts).done();
    }

上面的意思就是,假如我们使用cordova build命令,那么,他就会调用 build 方法。cordova-lib 的目录如下。下图所示的只是一部分常用的命令。

clipboard.png

在 build.js 里面,我们可以看到这样的代码。

    ...
    return hooksRunner.fire('before_build', options)
    .then(function() {
        return require('./cordova').raw.prepare(options);
    }).then(function() {
        return require('./cordova').raw.compile(options);
    }).then(function() {
        return hooksRunner.fire('after_build', options);
    });

也就是说,当执行 build 命令的时候,会先执行 prepare 命令。

接着我们来到 prepare.js 文件。在文件里,我们不难发现有如下代码

    exports = module.exports = prepare;
    function prepare(options) {
        ...
    }

接下来,cordova 被初始化的重点就在这里了。
首先更新我们的 config.xml 文件。

    ...
    if(fs.existsSync(parser.config_xml())){
        shell.cp('-f', parser.config_xml(), defaults_xml_path);
    }else{
        shell.cp('-f', xml, parser.config_xml());
    }
    ...

接着更新和替换我们的 assets/www 目录

    ...
    // Replace the existing web assets with the app master 
    parser.update_www();
    ...

在我们的 www 目录生成 plugins文件夹 和 cordova.js以及cordova_plugin.js文件。

    ...
    // Call plugman --prepare for this platform. sets up js-modules appropriately.
    var plugins_dir = path.join(projectRoot, 'plugins');
    events.emit('verbose', 'Calling plugman.prepare for platform "' + platform + '"');

    if (options.browserify) {
        plugman.prepare = require('../plugman/prepare-browserify');
    }
    plugman.prepare(platformPath, platform, plugins_dir, null, true, pluginInfoProvider);

    // Make sure that config changes for each existing plugin is in place
    var platformJson = PlatformJson.load(plugins_dir, platform);
    var munger = new PlatformMunger(platform, platformPath, plugins_dir, platformJson, pluginInfoProvider);
    munger.reapply_global_munge();
    munger.save_all();
    ...

最后其实 cordova help 里面已经告诉了这一些列的运行步骤。

clipboard.png

这就是这一切造成,当我们运行这些命令的时候,会被初始化的原因。

解决方案,就是将自己的 网页替换到和platforms,plugins 文件夹同级的 www 目录中。
执行这一些命令的时候,就不会被替换成 cordova 的初始化版本了。

  1. 以上的这一切解释都是我认为楼主遇到的问题。如果是其他问题,请具体描述一下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏