使用Cordova gradle包装器时指定不同的存储库

时间:2015-05-05 20:47:50

标签: android cordova gradle gradlew

我使用的是Cordova Android 4.0.0,它使用gradle包装器来构建。我需要指定一个不同于mavenCentral的存储库。我不能简单地修改build.gradle文件,因为它是由Cordova自动生成的。因为它使用了Cordova指定的包装器分发,所以我无法在分发中添加/init.d。我尝试添加一个似乎没有被使用的USER_HOME / .gradle / init.gradle文件。在使用我无法控制的包装器时,是否还有其他方法可以指定init文件?

编辑: 作为一种解决方法,我现在添加了一个after_prepare钩子来改变文本" mavenCentral()"在build.gradle文件中的任何地方找到我需要使用的repo。尽管如此,它必须是一个更好的基于gradle的解决方案......

4 个答案:

答案 0 :(得分:5)

我们使用离子并拥有我们自己使用的nexus存储库而不是mavenCentral。我们最终创建了一个钩子来解决这个open issue

添加一个钩子:

module.exports = function(ctx) {
    'use strict';
    var fs = ctx.requireCordovaModule('fs'),
        path = ctx.requireCordovaModule('path'),
        deferral = ctx.requireCordovaModule('q').defer(),
        replaceStream = require('replacestream'),
        async = require('async');
    var platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
    var gradleFiles = [path.join(platformRoot, 'build.gradle'), path.join(platformRoot, 'CordovaLib', 'build.gradle')];
    async.each(gradleFiles, function(f, cb) {
        fs.readFile(f, 'utf8', function(err, data) {
            if (err) {
                cb(err);
                return;
            }
            var result = data.replace(/mavenCentral\(\)/g, 'maven{url "http://nexus.corp.aal.au/content/groups/public-ad"}');
            fs.writeFile(f, result, 'utf8', cb);
        });
    }, function(err) {
        if (err) {
            deferral.reject();
        } else {
            deferral.resolve();
        }

    });
    return deferral.promise;
}

答案 1 :(得分:0)

您可以在gradle init脚本https://docs.gradle.org/current/userguide/init_scripts.html

中指定其他Maven存储库

像这样:

allprojects { repositories { maven { credentials { username 'your_user_name' password 'your_password' } url "https://your_repo" } maven { url "http://download.01.org/crosswalk/releases/crosswalk/android/maven2/" } } }

答案 2 :(得分:0)

这种方式可以起作用似乎随着时间而改变。我一直在努力让Cordova / Phonegap表现得很好。但是,这对我来说很有用:

  • 创建一个build.gradle文件或从新制作的Android Studio项目中复制一个 - 你知道,它喜欢默认放置jcenter()。示例如下。
  • 将其作为Android平台标记中gradleReference类型的自定义“框架”添加到您的plugin.xml文件中。示例如下。
  • 当我在这里时 - 如果您需要其他gradle更改,例如更改Java语言级别,您还可以包含build-extras.gradle文件以调整其他设置(不确定这些是否需要诚实地分开,但我已经到了我的皮带的尽头试图处理这个事情)。以下示例。是的,目标目录必须是src/..

示例build.gradle文件:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'net.example:some-sdk:2.3.1'
}

示例plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="io.proxsee" version="0.1.0">
    <!-- When you update this file, update the package.json too. -->
    <!-- Reference: https://cordova.apache.org/docs/en/latest/plugin_ref/spec.html -->
    <!-- .. other stuff .. -->
    <platform name="android">
        <!-- .. other stuff .. -->
        <framework src="build.gradle" custom="true" type="gradleReference" />
        <source-file src="build-extras.gradle" target-dir="src/.." />
    </platform>
</plugin>

示例build-extras.gradle

ext.postBuildExtras = {
    android {
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
        packagingOptions {
            exclude 'META-INF/ASL2.0'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/maven/com.squareup/javawriter/pom.xml'
            exclude 'META-INF/maven/com.squareup/javawriter/pom.properties'
        }
    }
}

答案 3 :(得分:0)

我以@ arun-gopalpuri的answer为基础,增加了对为Android应用程序中所有插件添加自定义存储库的支持。

它的工作方式是找到所有gradle文件,并将自定义存储库插入其他任何存储库之上(仅在尚未添加的情况下)。

const fs = require("fs");
const path = require("path");
const async = require("async");

module.exports = context => {
    "use strict";
    const repoUrl = "http://nexus.corp.aal.au/content/groups/public-ad";
    const gradleRepo = 'maven { url "' + repoUrl + '" }';
    return new Promise((resolve, reject) => {
        const platformRoot = path.join(context.opts.projectRoot, "platforms/android");

        const gradleFiles = findGradleFiles(platformRoot);

        async.each(
            gradleFiles,
            function(file, callback) {
                let fileContents = fs.readFileSync(file, "utf8");

                let insertLocations = [];
                const myRegexp = /\brepositories\s*{(.*)$/gm;
                let match = myRegexp.exec(fileContents);
                while (match != null) {
                    if (match[1].indexOf(repoUrl) < 0) {
                        insertLocations.push(match.index + match[0].length);
                    }
                    match = myRegexp.exec(fileContents);
                }

                if (insertLocations.length > 0) {
                    insertLocations.reverse(); // process locations end -> beginning to preserve indices
                    insertLocations.forEach(location => {
                        fileContents =
                            fileContents.substr(0, location) +
                            gradleRepo +
                            fileContents.substr(location);
                    });

                    fs.writeFileSync(file, fileContents, "utf8");
                    console.log("updated " + file + " to include repo " + repoUrl);
                }

                callback();
            },
            function(err) {
                if (err) {
                    console.error("unable to update gradle files", err);
                    reject();
                } else {
                    resolve();
                }
            },
        );
    });

    function findGradleFiles(dir) {
        let results = [];
        const list = fs.readdirSync(dir);
        list.forEach(fileName => {
            const filePath = path.join(dir, fileName);
            const stat = fs.statSync(filePath);
            if (stat && stat.isDirectory()) {
                // recurse into subdirectory
                results = results.concat(findGradleFiles(filePath));
            } else if (path.extname(filePath) === ".gradle") {
                results.push(filePath);
            }
        });
        return results;
    }
};

我们在Android挂钩中使用它:

<hook src="build/android/useInternalRepo.js" type="before_build" />

我已将其添加到未解决的Cordova问题(CB-9704)。