`
shangchm
  • 浏览: 30210 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

环境无关的环境

    博客分类:
  • ldap
阅读更多
环境无关的环境 Posted width = "1" height = "1" /> 问题: 在某台机器上运行正常的环境, 换到另外一台机器就gp, 或需要很繁琐的从头配置,浪费从几小时到几天不等的时间.
原因, 则通常包括环境的各个部分散落在不同角落, 不是少了这个就是少了那个, 或不同机器上版本不一样;还包括在配置中使用硬编码的绝对路径, 依赖全局环境变量或属性等.
机器环境虽然各有各的不同, 但依然有可能创建一个"环境无关的环境"
1. 使用相对路径代替绝对路径关键是如何获得当前路径, 如何确定根路径, 如何确保目录结构
            Windows和Unix都有内置的环境变量来表示当前路径, 分别是    %cd% 和 $PWD   
                Windows批处理脚本中, 还可以使用     %~dp0% 获得脚本所在路径; 而在Unix Bash 脚本中, 则可以使用 `pwd`,    即获得 pwd 命令的输出   
                如果总是需要引用某个根路径的话, 则可以使用环境变量来定义根路径(参见后面的环境变量).    其实相对路径配合固定的目录结构, 大大削减了对显式定义根路径的需求   
                那么如何保证目录结构是固定的呢? 自然是使用配置管理系统   
       
2. 使用配置管理系统(版本控制系统)配置管理系统不只是放源代码的, 只要有配置管理需求或配置管理能带来好处, 或需要有唯一的官方来源,都可以使用配置管理系统来管理; 环境的配置文件, 环境本身, 都可以置入配置管理之下. 有些公司的版本控制系统只放源代码, 连测试代码都分开另放.
            强制使用配置管理可解决固定的目录结构的问题   
                使用配置管理还可以解决丢三落四的问题   
                自然也可以解决所用工具版本不一致的问题   
       
这里有几个常见的问题:
            大型的系统软件如何处理, 比如 JDK, VC++编译器等, 是否也需要置入版本控制;    这个基本不用, 如果对其特定的版本有需求, 可在脚本中加入检查其版本的逻辑, 不满足则提示并退出即可   
                依赖的大量二进制库如何处理; 如果有必要可使用依赖管理工具如 Maven, Ivy 等,    而用于存放依赖的本地仓库依然应该置入配置管理, 哪怕不用其版本控制功能, 而只是利用其官方来源/备份存档等好处   
                必须放在特定位置的文件如何处理, 比如某个文件必须放在/etc目录下;    这个文件还是可以放在配置管理下的目录中, 而在/etc下创建符号链接来指向它; 并提供脚本来干这件事.   
       
3. 环境变量必要时使用环境变量来引用环境. 全局的环境变量可用作缺省值,在脚本中覆盖它(基本上, 这是"用户自定义属性"的一个实例).
4. 缺省值 + 用户自定义属性这是创建"环境无关的环境"的核心机制. 无论如何, 环境要在不同机器上部署, 总会需要修改某些配置,以适应宿主机器. 然而前面我们提到, 所有配置都已置入版本控制. 如果我们直接修改, 则每个环境中都会存在未提交的本地修改. 这是我们不希望看到的,因为当我们升级配置并更新到所有部署时, 可能会产生冲突. 这里其实是两个层面的问题:
        提供一种机制, 当环境与缺省配置不一致时, 允许用户修改    用户修改的文件应避免与官方文件更新的冲突
先说第一个.
缺省值当然可以直接定义在脚本或配置文件中.而多数常用的脚本和配置系统都提供了用户定义属性覆盖缺省值的机制. 比如:
            Windows批处理: set    path=my_extra_path;%path%   
                Bash: export PATH=my_extra_path:$PATH   
                Ant:
        <property file="user.properties"/>    <!-- user.properties 中可定义任何后面引用到的属性, 以覆盖其缺省值-->
        <property name="src.dir"    path="${basedir}" /> <!-- 定义"src.dir"的缺省值-->
                CruiseControl:
        <property name="src.dir"    value="http://www.blogjava.net/chelsea/archive/2009/06/04/." /> <!-- 定义"src.dir"的缺省值-->
        <property file="user.properties"/>    <!-- user.properties 中可定义任何后面引用到的属性, 以覆盖其缺省值-->
                注意Ant的属性是只读的, 先入为主. CruiseControl的属性则是后发制人.   
       
再说第二个.
有一个很简单的解决办法, 就是把用户自定义属性置入单独的文件,并且不要把它提交到版本控制系统中(一个理由是这一部分相对整个组织来说, 不存在也不需要唯一的官方来源)
前面例子中的 user.properties 就是一个用户自定义属性文件,只存在每个用户自己的机器上, 不在配置库中. 在Windows和Bash脚本中也可以类似处理
            Windows: call    user_env.bat   
                Bash: source ./user_env.sh    或 . ./user_env.sh   
       
随之而来的一个问题是, 这个用户相关的文件应该放在何处. 这里其实约定好就可以了, 比如当前路径,根路径, 甚至user的home路径都可以
参考借鉴
            至此, 这套东西在不同的机器上部署时, 只要从版本控制系统中check out出来即可使用了.    更进一步, 还可以提供脚本, 即生成器, 自动探测用户的环境, 来生成全套配置, 类似Rails生成应用框架那样.   
                其实, 这是一个规范性或标准性的问题. Neal Ford 在<<Productive    Programmer: 卓有成效的程序员>>中, 用一章的篇幅详述了各种解决方案, 包括配置管理, 符号链接等, 除此之外,    他还建议可以/应该使用虚拟机来统一项目组的开发环境等. 参见<<Productive Programmer: 卓有成效的程序员>>第五章.   
                另请参阅<<CruiseControl    Enterprise 最佳实践 (3) : Configuring CruiseControl the CruiseControl way>>,    是创建环境无关的持续集成环境的实例   
       
分享到:
评论

相关推荐

    用Docker构建与环境无关的系统

    摘要: 很多的工作和软件安装或维护机器有关,这些工作还处理环境的特殊性。这些特殊性作为全局范围的依赖关系(如已知主机...Docker有三个特定的功能,以帮助建立与环境无关的系统:只读文件系统 环境变量注入 存储卷

    论文研究-噪声环境下文本无关说话人识别研究 .pdf

    噪声环境下文本无关说话人识别研究,陈强,阙大顺,针对噪声环境下文本无关说话人识别率降低的问题,研究了改进的减谱法语音增强算法,并把该算法应用于说话人识别系统的前端处理,

    PhpStorm Xampp ThinkPHP 环境配置笔记

    PhpStorm Xampp ThinkPHP 环境配置笔记 需要有一定的 ThinkPHP 基础,至少知道 ThinkPHP 的目录怎么生成的 很多简单的细节我没写,比如 如何使用 perl ,这在 xampp-control 中的 Shell 中进入 php 目录运行指令即可...

    java环境变量设置

    Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。 本文介绍了,如何搭建JAVA编程环境,JDK安装,环境变量设置...

    异构环境下顺序无关的图像合成算法

    对于异构环境下顺序无关的图像合成问题,这些.算法不考虑环境的异构性,也没有利用顺序无关合成操作符的性质,因此容易造成资源的浪费。 针.对这个问题, 提出了一个异构环境下顺序无关的图像合成算法,它会根据...

    一些用于嵌入式环境中的与平台无关的在Windows上调试测试通过的代码.zip

    2. 能提供Python环境的产品有官网提供的Cpython,它是由C语言写的。还有PyPy及Jython等,Jython是基于java实现的Python环境,把Python代码编译为java字节码再执行。 3. 能提供Python环境的产品还有一个叫做Anaconda...

    支持任何环境的代码智能提示和补全工具

    代码智能提示的关键字提示与具体的编程环境无关,基本上可以支持所有windows下的文字编辑工具,如记事本,word,excel,和大部分的编程环境,vb,vc,visual fortran等,几乎支持任何编程语言(关键字文件由使用者...

    基于标准 C 编程语言的 STMicroelectronics MEMS 运动和环境传感器的平台无关驱动程序

    此存储库包含STMicroelectronics传感器的低级 平台无关驱动程序示例。传感器驱动程序和示例是用 C 编程语言编写的。 如果您使用的是STM32Cube 包,还要评估硬件抽象 与 STM32Cube 兼容的驱动程序。 ...

    数据库原理实验一_DB2实验环境设置_艾孜尔江·艾尔斯兰著.docx

    DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令。DB2采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,...

    AFTOX环境风险扩散模型(高斯色散模型)

    国家环境保护环境影响评价数值模拟重点实验室使用此模型,如有侵权请联系我删除,任何版权问题与平台及本人无关,不得用于非法用途。本程序版权所有,转载及印刷请与环境保护部环境工程评估中心联系。

    kp-lens:轻量级的与环境无关的SDK,用于构建图形用户界面

    与轻量级环境无关的SDK介绍轻量级的与环境无关的SDK,用于构建图形用户界面。应用程序典型的Lens应用程序由两个阶段组成,后端是用python编写的,前端是由类似于Web开发HTML5 / CSS3 / JS组成的。 Python和WebKit...

    maxplus2集成开发环境

    Max+plusⅡ是Altera公司提供的FPGA/...在Max+plusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。

    论文研究 - 马来西亚的环境空气污染与肺结核

    结果:结果显示,2011-2013年间API含量的95%为中等水平,与PTB无关。 但是,对于空气动力学直径为10μm或更小的颗粒物,活性PTB相对于EPTB的几率显着提高了95%(aOR = 1.006,95%CI:1.002,1.011),p值&lt;...

    assembler:与框架无关的构建环境

    汇编器 与框架无关的构建环境。

    异构环境中与顺序无关的图像合成

    异构环境中与顺序无关的图像合成

    mysql8.012与平台无关的JDBC

    mysql官网提供的JDBC,针对mysql8.0.12,使用时要保证JAVA环境在java8以上。

    Hyperledger Fabric环境配置,2023年1月28日整理亲测有效

    1.Hyperledger Fabric 1.4环境配置,尽管CSDN上存在很多Hyperledger Fabric环境配置教程,但是都存在各种问题,本文选择了一篇文章进行环境配置,同时对环境配置过程中产生的各种问题提出了解决方案,并亲测有效,...

    jscriptbox:与语言无关的脚本环境

    JScriptBox:使脚本API与语言无关 公开脚本API时,您需要为脚本提供一些变量和函数,运行脚本,然后查看设置了哪些输出和/或调用了哪些函数。 JScriptBox提供了一种以独立于脚本语言的方式将Java API公开给脚本语言...

Global site tag (gtag.js) - Google Analytics