【问题标题】:Cordova + Visual Studio + Android@7.0.0?Cordova + Visual Studio + Android@7.0.0?
【发布时间】:2017-12-09 14:07:53
【问题描述】:

有没有人能够获得最新的 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 解决了我眼前的问题。但这不是一个长期的解决方案。

【问题讨论】:

  • 你真的有 6.4.0 工作吗?我已经遇到了 6.4.0 的路径问题 6.3.0 是最后一个正常工作的。我确信它是基于路径的,因为如果您查看构建文件夹,您可以看到它会将带有 APK 的调试文件夹复制到 VS 的调试文件夹中。
  • 是的,似乎对我有用。我确实在某一时刻看到了问题,我删除了所有平台/插件并重新添加了它们。现在,6.4.0 似乎一切正常。我确实通过 Visual Studio 报告问题工具报告了该问题。
  • 我想知道这能起到多大的作用,我看到人们抱怨关于 config.xml 的烦人的唠叨弹出窗口,MS 说的几乎都是“好吧,我们目前只支持那个版本,所以吸吧” .
  • 您的意思是关于config.xml 更改的那个?他们正在重写文件,因此,IDE 会尽职地报告更改并提供“帮助”。这还不错。我更担心微软对 Cordova 的持续支持。对于它的价值,这是 link to my bug report 它已移至分类状态。所以,我充满希望。
  • 嗯,是的,这就是我想说的,他们要求 Cordova 7.1.0 支持,这就是 MS 所说的,所以我同意你的担忧。是的,它告诉您这很好,但是每次打开解决方案时都必须从内置更改为全局,这很烦人。无论如何,我认为这可能与他们制作的新 gradle/android studio 3 实现有关。

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


【解决方案1】:

有点老套,但这就是我要工作的地方。

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

到目前为止,我只关注过 Android,因此我将就此进行讨论。 cordova android 平台6.4+ 把内置的apk放在这里:

[项目]\platforms\android\app\build\outputs\apk\debug\app-debug.apk

Visual Studio 似乎在这里寻找它:

[项目]\platforms\android\build\outputs\apk\app-debug.apk

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

[项目]\hooks\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));
}

【讨论】:

  • 这是好东西,输出路径对我不起作用,如上代码,它想使用C:\Users\<user>\AppData\Roaming\npm\platforms\android\build\outputs\app-debug.apk这不太正确,我将行改为:var destfile = path.join(process.cwd(), "bin\\Android\\Debug\\app-debug.apk");这似乎工作得很好。
【解决方案2】:

对于这个答案https://stackoverflow.com/a/49270052/9874134,我对其进行了一些调整以使其适合我的情况。 “after_build”挂钩将 app-debug.apk 和 app-release 文件复制到 VS 正在查找的文件夹中。

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

[项目]\scripts\copy_android_apk.js

我在 [project]\config.xml 中添加了一个“after_build”钩子元素

<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;
        }
    }
}

【讨论】:

  • 这对我有用。我不得不将路径更改为没有应用程序目录,并且我的情况的 apk 名称不同。 var srcfile = path.join(process.cwd(), "platforms\\android\\build\\outputs\\apk\\debug\\android-debug.apk"); var destfile = path.join(process.cwd(), "platforms\\android\\build\\outputs\\apk\\android-debug.apk");
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
相关资源
最近更新 更多