我使用的是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的解决方案......
答案 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()
。示例如下。plugin.xml
文件中。示例如下。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)。