Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于环境变量更新config.json的预构建脚本

基于环境变量更新config.json的预构建脚本
EN

Stack Overflow用户
提问于 2020-06-15 15:49:33
回答 2查看 4.2K关注 0票数 7

我有一个角9应用程序,在这个应用程序中,我从一个资产文件夹读取api url:

代码语言:javascript
运行
AI代码解释
复制
@Injectable()
export class ConfigService {

  private configUrl = '../../../assets/config/config.json';

  constructor(private loggerService: LoggerService) { }

  public async loadConfig(): Promise<any> {
    try {
      const response = await fetch(this.configUrl);

      if (!response.ok) {
        throw new Error(response.statusText);
      }

      return await response.json();
    } catch (err) {
      this.loggerService.error(`ConfigService 'loadConfig' threw an error on calling ${this.configUrl} : ${err.tostring()}`);
    }
  }
}

Configuring angular production files after build中描述了用于读取配置文件的方法。

environment.ts

代码语言:javascript
运行
AI代码解释
复制
export const environment = {
  production: false,
  apiUrl: "https://localhost/api/",
};

environment.prod.ts

代码语言:javascript
运行
AI代码解释
复制
export const environment = {
  production: true,
  apiUrl: "https://server/api/",
};

config.json

代码语言:javascript
运行
AI代码解释
复制
{
  "apiUrl": "http://someTestServer/api/"
}

不完全脚本复制apiUrlconfig.json的脚本

代码语言:javascript
运行
AI代码解释
复制
var fs = require("fs");
fs.readFile(`./src/environments/environment.${process.env.CONFIG}.ts`, 'utf8', function (err, data) {

  fs.writeFile('./src/assets/config/config.json', data, function (err) {
    if (err) throw err;
    console.log('complete');
  });
});

我的package.json脚本部分如下所示:

代码语言:javascript
运行
AI代码解释
复制
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "build-test": "CONFIG=test node update-config.js && npm run build",
    "build-prod": "CONFIG=prod node update-config.js && npm run predeploy",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "predeploy": "ng build --prod",
    "deploy": "node ftpdeploy.js"
  }

考虑到上面的情况:如何在构建之前根据不同的环境变量自动填充config.json文件的内容,这样我就不需要手动地复制和粘贴json文件到\dist文件夹了?

更新1:现在我可以将enviroment.xxx.ts的内容复制到config.json文件中。还有一个问题:当我从environment.xxx.ts复制内容时,它会将environment.xxx.ts的全部内容复制到config.json中(它还会复制environment.xxx.ts的导入部分),然而,预期的结果是将environment (export const environment)读入对象中,并根据源environment对象更新config.json。我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2020-06-18 05:38:03

将预构建脚本更改为:

代码语言:javascript
运行
AI代码解释
复制
const fs = require("fs");
fs.readFile(`/src/environments/${process.env.CONFIG}.ts`, (err, content) => {
  fs.writeFile("/src/assets/config/config.json", JSON.stringify(versionObject), () => { });
});

然后从命令行(假设npm run build是要构建的命令,否则使用build命令更改它):

代码语言:javascript
运行
AI代码解释
复制
$ CONFIG=environment npm run build

应该解决你的问题。

编辑:

代码语言:javascript
运行
AI代码解释
复制
"scripts": {
  "ng": "ng",
  "start": "ng serve",
  "build": "ng build",
  // add more lines as you need like this, one for each build environment
  "build-test": "CONFIG=test node update-config.js && npm run build",
  "build-prod": "CONFIG=prod node update-config.js && npm run predeply",
  "test": "ng test",
  "lint": "ng lint",
  "e2e": "ng e2e",
  "predeploy": "ng build --prod",
  "deploy": "node ftpdeploy.js"
},

我在您的问题中注意到了一个\,可能您是在Windows下运行的,请确保使用一个bash:添加一个名为.npmrc的文件,其中只包含以下一行script-shell=bash

编辑:如果您想用fetch读取环境文件并使用await response.json()解析它,那么该文件应该是一个json文件,而不是ts文件:

代码语言:javascript
运行
AI代码解释
复制
{
  production: true,
  apiUrl: "https://server/api/",
}

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2020-06-24 23:40:10

根据您在更新的帖子和评论中所指出的,您想要达到的目标是不可能的。

基本上,您希望将一个对象(environment)值复制到一个json文件中,但是这个对象会从其他人那里导入它的一些值。

所以你有这样的东西

somewhere.ts

代码语言:javascript
运行
AI代码解释
复制
export const constantValue = "myValue";

environment.xx.ts

代码语言:javascript
运行
AI代码解释
复制
import {constantValue} from "./somewhere";

export const environment = {
  production: false,
  apiUrl: "https://localhost/api/",
  otherValue: constantValue
};

Problem:在构建之前,您无法访问constantValue的值,因此不能真正将其作为预构建脚本。

构建之后,environment对象将包含在main-es2015XXX.js中。但是,只有在otherValue配置中启用buildOptimizer时,才能解析angular.json的值,如下所示:

对于buildOptimizer : false,该值尚未解析,它将在运行时进行。因此,您不能使用这些值来编写json文件。environment变量将如下所示:

代码语言:javascript
运行
AI代码解释
复制
const environment = {
  production: false,
  apiUrl: "https://localhost/api/",
  otherValue: _somewhere__WEBPACK_IMPORTED_MODULE_0__["constantValue"]
};

使用buildOptimizer : true,可以在构建时解析常量的值。值将如下所示

代码语言:javascript
运行
AI代码解释
复制
const i={production:!1,apiUrl:"https://localhost/api/",otherValue:"myValue"}

但是,mainXXX.js中的代码被缩小/丑陋了,我怀疑您是否能够解析/提取上面的配置值.

因此,要么删除所有导入(使用硬编码值)并使用Daniele Ricci的答案,要么手动创建json文件。

Note

我没有完全理解您这么做的原因,但我的感觉是,在您的代码中,您应该使用:

  • 值来自environment.ts,用于生成后不更改的值,如在生成

后可更改的值,则为config.json值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62398794

复制
相关文章
快速理解 Vite 的依赖预构建
当我们使用 Vite 进行开发时,会进行依赖预构建,即将第三方依赖进行打包,并在开发环境下使用这些打包过的第三方依赖。
CandyTong
2023/02/24
1.5K0
快速理解 Vite 的依赖预构建
快速理解 Vite 的依赖预构建
当我们使用 Vite 进行开发时,会进行依赖预构建,即将第三方依赖进行打包,并在开发环境下使用这些打包过的第三方依赖。
CandyTong
2022/09/04
4.2K1
git更新脚本
说明 此脚本用于更新git仓库,主要用于使用ssh克隆的仓库,使用https克隆或者直接下载的不可使用此脚本进行更新,编写此贴用于保存脚本以供后用 Linux平台 Linux平台下的脚本使用的是bash shell脚本进行编写的 #! /bin/bash ######################################## #Usage: ./update comment "msg" ######################################## echo st
impressionyang
2021/05/06
8180
hbase的预region分区 脚本 经典 转
Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下:
stys35
2019/03/05
2K0
Gradle 构建脚本
Gradle提供了一种领域特定语言,目前同时支持 Groovy 和 Kotlin 。
佛系编码
2019/12/11
9230
Gradle 构建脚本
详解 Vite 依赖预构建流程
大家好,我是码农小余。我们知道,首次执行 vite 时,服务启动后会对 node_modules 模块和配置 optimizeDeps 的目标进行预构建。本节我们就去探索预构建的流程。
码农小余
2022/06/16
4.7K0
详解 Vite 依赖预构建流程
jenkins构建时环境变量问题
which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin) The JAVA_HOME environment variable is not defined correctly This environment variable is needed to run this program NB: JAVA_HOME should point to a JDK not a JRE
dogfei
2020/07/31
1.1K0
ansible执行带有环境变量的脚本不生效
jenkins发布时,使用ansible执行远程主机上的启动tomcat脚本发现不生效,启动tomcat的脚本中有环境变量。
HaydenGuo
2019/12/12
2.9K0
ansible执行带有环境变量的脚本不生效
构建与部署的脚本化
构建和部署系统必须一直保持活力,即这个系统不仅要从项目刚开始就开发,而且一直要持续到软件在生产环境中的维护阶段。一定要细心地设计和维护它,像对待其他源代码一样对待它,并定期使用,以便当我们需要时,可以确保它还能运行。
新亮
2022/06/30
3550
通过bat脚本配置系统环境变量
用户3519280
2023/07/08
1.4K0
[Go]解决goland terminal 环境变量不更新
在自己的电脑修改了PATH环境变量 , 但是goland terminal不更新 goland只在开机启动的时候会去读取系统的PATH环境变量 1.可以重启电脑解决 2.手动在terminal中设置一
唯一Chat
2021/04/26
3.1K0
[Go]解决goland terminal 环境变量不更新
【综述】基于Transformer的视频语言预训练
Survey: Transformer based Video-Language Pre-training
CV君
2022/04/18
1.1K0
【综述】基于Transformer的视频语言预训练
设置系统环境变量立即生效的VBS脚本
可以设置环境变量并立即生效, 与Windows批处理不同的是此脚本设置的环境变量可保证重启后一样有用. 保存以下内容为 设置环境变量.vbs , 修改要设置的环境变量名即路径即可开始运行设置. Set pSysEnv = CreateObject("WScript.Shell").Environment("System") 'Check whether a character string matches a regular expression ' ^\w+[@]\w+[.]\w+$ E
张善友
2018/01/19
1.8K0
ddns脚本更新DNSPod的解析记录
前两天dnspod突然跟新了API,说是向下兼容旧的API,但是我软路由用的别人的脚本不能正常解析.
小柒吃地瓜
2020/04/23
5K0
Python自动更新脚本
本脚本主要针对python2.6升级至python2.7.12,并且解决了升级后不能使用yum的问题。添加了ipython功能
py3study
2020/01/07
1.2K0
[Linux][bash]更新cowsay和fortune的bash脚本
上次更新fortune自定义发现召唤cowsay的bash shell脚本有小概率的bug,就是随机脚本可能超出cows列出图形的数量,这里修补下。
用户9314062
2022/05/20
6930
config.json详解【鸿蒙专题07】
上一节我在webview的实现中,用到了几个文件夹,这是单独拎出来,做一个介绍,这样的好处就是可以使你更加容易理解一个应用的开发流程。
徐建国
2022/03/30
1.5K0
config.json详解【鸿蒙专题07】
【安德鲁斯】基于脚本的数据库&quot;增量更新&quot;,如果不改变,每次更新java代码、!
1.当然,它是基于SQLiteOpenHelper.onCreate(第一个呼叫建立)、onUpdate(当所谓的升级计划)
全栈程序员站长
2022/07/18
4760
【安德鲁斯】基于脚本的数据库&quot;增量更新&quot;,如果不改变,每次更新java代码、!
数据获取脚本重大更新
之前很多脚本都有从高德获取,某个路径(公交地铁线路、OD导航等等)。由于我自己不太常用(是的,目前的状态是既不用画图,也不用做项目,平时看书写字、想事情),所以也没有体会到最后想导进ArcGIS的艰难(特别是一条路径一条路径地导入)。
Sidchen
2021/04/13
5520
数据获取脚本重大更新
golang构建项目的脚本
说来有些悲哀,最近升级了VSCode,golang插件居然无法使用了,一直无法使用,配置了大半天,还是不行,只能提交了反馈,希望能够得到回复吧。不过突然想到一个方法,就是编写脚本,然后在本地运行,虽然
陨石坠灭
2020/01/21
1.2K0
golang构建项目的脚本

相似问题

预生成脚本路径和预构建脚本参数

12

预蜂窝渲染脚本的构建

23

如何基于环境构建预渲染页面

11

Powershell预构建脚本从msbuild失败

14

Microsoft TFS构建过程,如何运行多个脚本作为预构建脚本。

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档