文章目录

  • 将环境变量统一至于一个shell脚本文件
  • 使用find+sed进行查找替换

长久以来,对环境相关变量的处理一直是应用程序在构建部署时普遍遇到的问题,对于这些环境相关变量的替换一般会选择在下面两个环节中的一个完成:

  • 编译期
  • 安装部署期

就编译期的环境变量替换,Maven的Profile机制可算是一个非常经典的实现了,也是当之无愧的最佳实践,其他构建工具也有类似的功能,这种依赖编译工具在编译时将面向特定环境的变量进行替换的作法可以满足大多数的项目的需求。

但是在编译期处理也有一些“不便之处”:

  • 用户必须检出源代码进行编译才能得到适合自己环境的安装包,操作起来比较麻烦
  • 为了完成编译,用户还必须先行安装编译工具,编译过程中还需要下载依赖包,费力耗时
  • 用户必须熟悉工程使用的构建工具,才能准确找到修改配置环境变量的地方

对于一个开发团队来说,可以通过文档和培训快速掌握相关技能,但如果应用是开源项目,对公共开放的话,从编译开始构建应用是不够友好的,侧面提高了使用项目的技术门槛,不利于于项目的应用和推广。所以,即使应用程序已经在编译期实现了变量替换,为程序安装包提供安装部署期的环境变量替换依然是非常值得一做的,这可以帮助用户跳过源代码编译,直接在本地安装。

接下来我们就重点讨论一下如何在安装部署期进行环境变量的替换,这里有两点最佳实践:

将环境变量统一至于一个shell脚本文件

我们应该把环境变量统一提取到一个独立的shell脚本中,可取名为env.shconstants.sh,其他脚本通过source命令引入该脚本,脚本中的变量定义使用如下格式:

APP_HOST="${app.host}"
APP_USER="${app.user}"

对于变量实际取值的替换,可以由两种方式独立实现:

  • 在编译期,借助Maven的Profile机制完成变量替换
  • 在安装部署期,可以在安装脚本(如install.sh一类的shell脚本)中通过sed命令进行变量替换

这一做法的好处是:两种变量替换方式彼此独立,互不干扰,灵活满足不同情形下的环境变量的替换问题。

使用find+sed进行查找替换

上述作法已经可以满足绝大多数应用了,但是不排除有一些环境变量不能或不方便提取到shell中的情况,举个例子:在大数据项目中会包含数量庞大的sql文件,这些sql会频繁地引用hdfs或s3上的路径,这些路径都是环境相关的,取决于用户分配的目录,例如下面的sql:

create table if not exists user(`id` bigint,`name` string,...
)
partitioned by (year string, month string)
stored as parquet
location 's3://${data.bucket}/user/';

这些sql中大量使用${data.bucket}这些的Maven变量,以期望在编译期进行变量替换,由于这是sql文件,不能或不方便像shell那样在一个统一的地方定义这些变量。

类似这样的情形,我们可以使用find+sed命令,大批量地进行查找和替换,例如下面的命令:

find "/my-project-home/sql/" -type f -name "*.sql" -print0 | xargs -0 sed -i "s|s3://[a-zA-Z0-9_-]*/|s3://$DATA_BUCKET/|g"

将可以将类似s3://my-data-bucket/user/一类的路径替换为变量DATA_BUCKET的值。


关于作者:耿立超,架构师,15年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验,热衷函数式编程。对Hadoop/Spark 生态系统有深入和广泛的了解,参与过Hadoop商业发行版的开发,曾带领团队建设过数个完备的企业数据平台,个人技术博客:https://laurence.blog.csdn.net/ 作者著有《大数据平台架构与原型实现:数据中台建设实战》一书,该书已在京东和当当上线。

工程安装与部署中处理环境变量的最佳实践相关推荐

  1. 中修改环境变量_Golang入门(1):安装与配置环境变量的意义

    摘要 在几年前学习Java的时候,环境的配置就会劝退一部分的初学者.而对于Golang来说,也需要从环境的配置开始学起.这一篇文章将从如何安装Golang开始讲起,随后将会提到Golang中的环境变量 ...

  2. Windows 中的环境变量 Path 与 XXXX_HOME 的区别

    Windows 中的环境变量 Path 与 XXXX_HOME 的区别 XXXX_HOME Path   开发经常需要配置 Windows 中的环境变量,其中经常需要配置的环境变量有 Path.XXX ...

  3. WinCE中,环境变量的添加,删除和查询

    在WinCE中有很多的环境变量,那么如何设置/删除/查询这些环境变量呢: 1. 查询环境变量:当我们在PB里打开或者创建一个工程以后,我们可以在菜单中点 "build"->& ...

  4. python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式

    Python的安装.认识.配置环境变量以及helloworld打印的两种方式 一. 安装和配置环境变量 首先我们去到Python的官方下载地址根据自己的电脑机型来下载最新的python安装包,网址是h ...

  5. PowerShell中的环境变量

    环境变量是Linux,Mac或Windows计算机的全局设置,存储为系统外壳程序在执行命令时使用. 许多是在安装或用户创建期间默认设置的. 例如,登录时将主目录设置为环境变量.在PowerShell中 ...

  6. 安装java 并配置环境变量_安装Java JDK并配置环境变量

    学习JAVA,必须得安装一下JDK(java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程: 点开链接你应该看到如下图所示的界面 ...

  7. 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量

    每当我们进行系统清理时,清理软件总能自动找到Windows的临时文件夹之所在,然后加以清理,即便是我们重定向了TEMP目录也是如此.究其原因,是因为清理软件会根据TEMP环境变量来判断现有临时文件夹的 ...

  8. macbook配置java环境变量_Mac系统中如何配置JDK环境变量?Mac中JDK环境变量配置教程...

    Mac系统中如何配置JDK环境变量?在使用mac系统的电脑时,如何进行设置JDK环境变量呢?接下来的文章中小编将会带来详细的介绍,希望对您有所帮助. Mac中JDK环境变量配置教程 1.访问Oracl ...

  9. Windows中的环境变量一览

    环境变量是操作系统中一组具有名称的值,能够影响应用程序的执行效果.环境变量是应用程序的执行环境的组成部分,例如:一个正在运行的程序可以通过"TEMP"这个环境变量来获取操作系统中用 ...

最新文章

  1. sharepoint2010 创建自定义列表
  2. springboot session默认失效时间_Spring Boot 整合 Redis,用起来真简单
  3. Reverse Sort 思维
  4. Bootstrap4+MySQL前后端综合实训-Day05-AM【MySQL数据库(SQLyog软件基本操作、架构设计器)、eclipse(JDBC开发-添加驱动、构建路径、增删改查基本测试)】
  5. react手机机端css_react工程搭建系列之---移动端适配与antd-mobile高清适配方案
  6. python矩阵_Python矩阵
  7. 机器学习 Machine Learning- 吴恩达Andrew Ng 第21~25课总结
  8. 大量的linux、H3C、cisco、华为、模拟器、adobe教程
  9. visio2007序列号
  10. web前端开发视频教程完整54讲下载
  11. 宝马「试水」神经形态芯片
  12. 神秘诡异的量子世界是如何毁掉科学家三观的?
  13. DhtmlxGrid第一次接触,jsp页面
  14. kirin710f是什么处理器_麒麟710F处理器怎么样
  15. 2015.8.23——张佳莉
  16. 基于评论的跨境电商产品满意度分析_kaic
  17. Python中求矩阵的逆
  18. mysql 瘦身_Mysql瘦身方法
  19. 超详细的MySQL入门教程(三)
  20. java key类型_Java 基础类型

热门文章

  1. 没有U盘纯硬盘安装linux之Archlinux
  2. QT程序按钮效果制作
  3. 2023最新简历模板免费下载
  4. 微博轻量级RPC框架Motan
  5. 【学习打卡】CAM可解释性分析-算法讲解
  6. 计算机毕业设计源代码Python毕业论文题目基于Python实现的学生在线选课系统[包运行成功]
  7. c语言handler指针,详解C++ new-handler机制
  8. C#获取本机IP地址的4种方式
  9. Android 炫酷的手势动画,16个超级漂亮的手机锁屏图案,炫酷到飞起,总有一款适合你...
  10. 霍尔电流传感器CH701/CH701W应用于电动汽车模式2充电的装置