如何操作“中的ProjectIdentifier/app identifier”;“准备前”-挂接NativeScript

如何操作“中的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){ 返回新承诺((解决、

是否有办法通过NativeScript(6.3)中的特定钩子(例如,在准备之前)更改/操作应用程序id(com.somename.xyz)

我们正在使用带有一些符号链接的白标签应用程序(来自同一代码库的多个客户端)来使用不同的CSS文件、字体等,并希望以编程方式更改包名:

文件:
/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