Cordova + Visual Studio + Android@7.0.0?

时间:2017-12-09 14:07:53

标签: android cordova visual-studio-2017 visual-studio-cordova

有没有人能够使用最新的android更新(7.0.0)与visual studio一起工作?

VS说构建成功,但是当您尝试部署时,该步骤失败,因为它无法找到创建的输出。

认为这可能是更新一些路径的问题,但我想看是否有人已经弄清楚了。

鉴于taco.visualstudio.com自2017年6月以来没有看到更新,我想知道该项目是否已经死亡: - (

1>------ Build started: Project: myProject, Configuration: Debug Android ------
Cordova 7.1.0
------ Platform android already exists
------ Copying native files from D:\myproject\res\native\android to D:\myproject\platforms\android
------ Done copying native files to D:\myproject\platforms\android
2>------ Deploy started: Project: myProject, Configuration: Debug Android ------
2>Could not locate the start page. You may need to build your project.
2>Deployment failed.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Deploy: 0 succeeded, 1 failed, 0 skipped ==========

编辑:退回到Android@6.4.0已解决了我的直接问题。但这不是一个长期的解决方案。

2 个答案:

答案 0 :(得分:2)

有点hacky,但这就是我的工作。

https://developercommunity.visualstudio.com/content/problem/199609/cordova-ios-640-deployment-error-due-to-change-bui.html获得线索 (虽然建议的路径对我不起作用)

到目前为止,我一直只关注Android,所以我会就此进行讨论。 cordova android平台6.4+将建立的apk放在这里:

[项目] \平台\机器人\应用\构建\输出\ APK \调试\ APP-debug.apk

Visual Studio似乎在这里寻找它:

[项目] \平台\机器人\构建\输出\ APK \ APP-debug.apk

我添加了一个“after_build”钩子,它将app-debug.apk和output.json文件复制到VS正在查找的文件夹中。我不得不手动添加文件夹结构(用于复制文件的位置和位置)挂钩文件)。我刚刚添加了以下文件,构建过程会自动选择它。

[项目] \钩\ after_build \ copy_android_apk.js

copy_android_apk.js的内容:

#!/usr/bin/env node

console.log(" -- manual step -- have to copy apk to this folder because that is where VS is looking for it...");

var fs = require('fs');
var path = require('path');
var rootdir = process.argv[2];

var srcfile = path.join(rootdir, "platforms\\android\\app\\build\\outputs\\apk\\debug\\app-debug.apk");
var destfile = path.join(rootdir, "platforms\\android\\build\\outputs\\apk\\app-debug.apk");

var destdir = path.dirname(destfile);
if(fs.existsSync(srcfile) && fs.existsSync(destdir)) {
    fs.createReadStream(srcfile).pipe(
        fs.createWriteStream(destfile));
}

srcfile = path.join(rootdir, "platforms\\android\\app\\build\\outputs\\apk\\debug\\output.json");
destfile = path.join(rootdir, "platforms\\android\\build\\outputs\\apk\\output.json");

destdir = path.dirname(destfile);
if(fs.existsSync(srcfile) && fs.existsSync(destdir)) {
    fs.createReadStream(srcfile).pipe(
        fs.createWriteStream(destfile));
}

答案 1 :(得分:2)

对于这个答案https://stackoverflow.com/a/49270052/9874134,我稍微调整一下以使其适用于我的案例。 " after_build" hook将app-debug.apk和app-release文件复制到VS正在查找的文件夹中。

我将copy_android_apk.js放在[project] \ scripts \

[项目] \脚本\ copy_android_apk.js

我添加了一个" after_build" [project] \ config.xml

中的hook元素
<platform name="android">
  <hook src="scripts/copy_android_apk.js" type="after_build" />
</platform>

copy_android_apk.js的内容:

#!/usr/bin/env node

module.exports = function (context) {
    console.log(" -- manual step -- have to copy apk to this folder because that is where VS is looking for it...");

    var fs = require('fs');
    var path = require('path');
    var rootdir = process.argv[2];

    var srcfile = path.join(process.cwd(), "platforms\\android\\app\\build\\outputs\\apk\\debug\\app-debug.apk");
    var destfile = path.join(process.cwd(), "platforms\\android\\build\\outputs\\apk\\app-debug.apk");

    var destdir = path.dirname(destfile);

    //Create the output directory if it doesn't exist
    if (!fs.existsSync(destdir)) {
        mkdirSyncRecursive(destdir);
    }

    if (fs.existsSync(srcfile) && fs.existsSync(destdir)) {
        fs.createReadStream(srcfile).pipe(
            fs.createWriteStream(destfile));
    }

    srcfile = path.join(process.cwd(), "platforms\\android\\app\\build\\outputs\\apk\\release\\app-release.apk");
    destfile = path.join(process.cwd(), "platforms\\android\\build\\outputs\\apk\\app-release.apk");

    destdir = path.dirname(destfile);
    if (fs.existsSync(srcfile) && fs.existsSync(destdir)) {
        fs.createReadStream(srcfile).pipe(
            fs.createWriteStream(destfile));
    }

    /**
     * Splits whole path into segments and checks each segment for existence and recreates directory tree from the bottom.
     * If since some segment tree doesn't exist it will be created in series.
     * Existing directories will be skipped.
     * @param {String} directory
     */
    function mkdirSyncRecursive(directory) {
        var path = directory.replace(/\\$/, '').split('\\');
        for (var i = 1; i <= path.length; i++) {
            var segment = path.slice(0, i).join('/');
            !fs.existsSync(segment) ? fs.mkdirSync(segment) : null;
        }
    }
}