如何操作“中的ProjectIdentifier/app identifier”;“准备前”-挂接NativeScript
是否有办法通过NativeScript(6.3)中的特定钩子(例如,在准备之前)更改/操作应用程序id(com.somename.xyz) 我们正在使用带有一些符号链接的白标签应用程序(来自同一代码库的多个客户端)来使用不同的CSS文件、字体等,并希望以编程方式更改包名: 文件:如何操作“中的ProjectIdentifier/app identifier”;“准备前”-挂接NativeScript,nativescript,Nativescript,是否有办法通过NativeScript(6.3)中的特定钩子(例如,在准备之前)更改/操作应用程序id(com.somename.xyz) 我们正在使用带有一些符号链接的白标签应用程序(来自同一代码库的多个客户端)来使用不同的CSS文件、字体等,并希望以编程方式更改包名: 文件:/hooks/before prepare/app identifier.js module.exports=函数($logger、$projectData、$injector、hookArgs){ 返回新承诺((解决、
/hooks/before prepare/app identifier.js
module.exports=函数($logger、$projectData、$injector、hookArgs){
返回新承诺((解决、拒绝)=>{
$projectData.projectIdentifiers.ios='com.somename.xyz'
$projectData.projectIdentifiers.android='com.somename.xyz'
解决()
})
}
…但应用程序是从
“已在设备模拟器上成功同步应用程序com.brand.abc。”
(在我们的package.json中定义)您可以在准备hook后在
中执行此操作-对于Android,通过修改strings.xml
文件,对于iOS,通过编辑plist
:
var plist = require('simple-plist');
var path = require("path");
var fs = require("fs");
module.exports = function($logger, $projectData, hookArgs) {
return new Promise(function(resolve, reject) {
const platformFromHookArgs = hookArgs && (hookArgs.platform || (hookArgs.prepareData && hookArgs.prepareData.platform));
const platform = (platformFromHookArgs || '').toLowerCase();
var env = (hookArgs.platformSpecificData || hookArgs.prepareData).env;
if (platform === 'ios') {
let infoFile = path.join($projectData.platformsDir, "ios", $projectData.projectName, $projectData.projectName + '-Info.plist');
if (fs.existsSync(infoFile) && env && env.version ) {
let parts = env.version.split('.');
let data = plist.readFileSync(infoFile);
if (env.environment && env.environment !== 'prod') {
data.CFBundleDisplayName = env.environment + ' - ' + data.CFBundleDisplayName
}
plist.writeFileSync(infoFile, data);
}
}
if (platform === 'android') {
infoFile = path.join($projectData.platformsDir, 'android','app', 'src', 'main', 'res','values', 'strings.xml');
if (fs.existsSync(infoFile) && env && env.environment && env.environment !== 'prod') {
let contents = fs.readFileSync(infoFile,'utf8');
contents = contents.replace(/MyNativeScriptAppName/g, env.environment + ' - MyNewEnvname');
fs.writeFileSync(infoFile, contents);
}
}
resolve();
});
}
请注意,以上假设在tns build
命令中设置了环境变量。这可以通过使用网页的DefinePlugin
来完成:
// Define useful constants like TNS_WEBPACK
new webpack.DefinePlugin({
"global.TNS_WEBPACK": "true",
"process.env": {
environment: (env && Object.prototype.hasOwnProperty.call(env, 'environment')) ? JSON.stringify(env.environment) : undefined
},
}),
您可以在准备后的钩子中执行此操作-对于Android,通过修改strings.xml
文件,对于iOS,通过编辑plist
:
var plist = require('simple-plist');
var path = require("path");
var fs = require("fs");
module.exports = function($logger, $projectData, hookArgs) {
return new Promise(function(resolve, reject) {
const platformFromHookArgs = hookArgs && (hookArgs.platform || (hookArgs.prepareData && hookArgs.prepareData.platform));
const platform = (platformFromHookArgs || '').toLowerCase();
var env = (hookArgs.platformSpecificData || hookArgs.prepareData).env;
if (platform === 'ios') {
let infoFile = path.join($projectData.platformsDir, "ios", $projectData.projectName, $projectData.projectName + '-Info.plist');
if (fs.existsSync(infoFile) && env && env.version ) {
let parts = env.version.split('.');
let data = plist.readFileSync(infoFile);
if (env.environment && env.environment !== 'prod') {
data.CFBundleDisplayName = env.environment + ' - ' + data.CFBundleDisplayName
}
plist.writeFileSync(infoFile, data);
}
}
if (platform === 'android') {
infoFile = path.join($projectData.platformsDir, 'android','app', 'src', 'main', 'res','values', 'strings.xml');
if (fs.existsSync(infoFile) && env && env.environment && env.environment !== 'prod') {
let contents = fs.readFileSync(infoFile,'utf8');
contents = contents.replace(/MyNativeScriptAppName/g, env.environment + ' - MyNewEnvname');
fs.writeFileSync(infoFile, contents);
}
}
resolve();
});
}
请注意,以上假设在tns build
命令中设置了环境变量。这可以通过使用网页的DefinePlugin
来完成:
// Define useful constants like TNS_WEBPACK
new webpack.DefinePlugin({
"global.TNS_WEBPACK": "true",
"process.env": {
environment: (env && Object.prototype.hasOwnProperty.call(env, 'environment')) ? JSON.stringify(env.environment) : undefined
},
}),
你确定你的钩子在运行吗?你做了一些日志检查了吗?钩子似乎运行正常$projectData.ProjectIdentifier在日志中已更改…但在其他/更高版本的钩子(“准备后”或“安装前”)中未更改。是否确定钩子正在运行,是否通过制作一些日志进行检查?钩子似乎正在正确运行$projectData.ProjectIdentifier在日志中更改…但在其他/更高版本的钩子(“准备后”或“安装前”)中保持不变感谢您的帮助-但您正在更改应用程序名称…不是应用程序ID(在package.json->nativescript->ID中定义)为True,而是上述内容也可用于此目的。在my build pipeline(Azure Devops)中,在签出repo(基于环境变量)后,应用程序id将直接更改:-bash:| sed-i.bak的/my.app.id/my.app.id_u'$(BACKEND_ENV)/”package.jsontanks以获取帮助-但是您正在更改应用程序名称…而不是应用程序id(在package.json->nativescript->id中定义)True,但上述内容也可用于此目的。在我的构建管道(Azure Devops)中,在签出repo(基于环境变量)后直接更改应用程序id:-bash:| sed-i.bak's/my.app.id/my.app.id_u'$(BACKEND\u ENV)/'package.json