`
shangchm
  • 浏览: 31151 次
  • 性别: 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>>,    是创建环境无关的持续集成环境的实例   
       
分享到:
评论

相关推荐

    java环境配置,一看就会

    在计算机科学领域中,Java是一种广泛使用的编程语言,它以其平台无关性、健壮性和面向对象的特性而闻名。对于初学者来说,正确地配置Java环境是学习旅程的第一步。本文将详细介绍如何配置Java环境,确保读者能够轻松...

    java环境变量设置

    Java是一种简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。由于这些特点,Java被广泛应用于企业级应用开发,移动应用开发等多个领域。 Java开发环境的搭建可以分为两...

    WINDOWS设备环境详解

    设备环境(Device Context,简称DC)是Microsoft Windows操作系统中的一个重要概念,主要用于实现设备无关性编程。在Windows编程中,开发人员不能直接访问物理显示硬件(如显示器、打印机等),而是通过DC这个抽象层...

    专题资料(2021-2022年)GJB103290电子产品环境应力筛选方法.doc

    3. 非环境应力筛选:与环境因素无关的故障,如安装不当、仪器故障、操作错误等。 4. 优势频率:功率谱密度曲线上最大值对应的频率。 5. 瞬态故障:需要特定环境应力才能显现的故障。 标准的一般要求规定: 1. 所有...

    JSP实验环境配置

    * 在WEB-INF目录中放入web.xml文件,从webapps目录的原有示例应用内复制web.xml文件,再删除无关内容。 * 在tomcat\conf\web.xml文件中找到这样的语句:&lt;init-param&gt; &lt;param-name&gt;listings&lt;/param-name&gt; ...

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

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

    ReWorks嵌入式实时操作系统和ReDe嵌入式软件开发环境.docx

    同时,通过对MMU的抽象,使接口实现与具体的硬件特性无关,保证ReWorks能够顺利移植到其他硬件平台,包括对不具备MMU能力的硬件平台的支持。 ReDe嵌入式软件开发环境是为ReWorks提供的嵌入式软件开发环境,提供了...

    搭建java环境

    Java是一种广泛使用的高级编程语言,它具有平台无关性、面向对象等特点。为了能够在计算机上运行Java程序,我们需要安装两个主要的组件:JDK(Java Development Kit)和JRE(Java Runtime Environment)。 - **JDK*...

    WPF分辨率无关性应用

    **WPF分辨率无关性应用详解** 在传统的Windows编程中,开发者通常...总之,WPF的分辨率无关性使得开发者能够创建适应不同屏幕环境的高质量UI,提升了用户体验。理解和掌握这一特性是开发现代跨平台WPF应用的关键步骤。

    Java+mysql环境配置

    4. **CVS客户端配置** (与Java+MySQL配置无关,但相关于协同开发) - **CVS(版本控制系统)**: 用于跟踪代码更改和多人协作的工具,这里提到的是WinCVS客户端。 - **安装WinCVS**: 下载并安装WinCVS,类似于安装...

    JAVA环境搭建

    在计算机科学领域中,Java是一种广泛使用的高级编程语言,因其平台无关性、健壮性和安全性等特点而备受青睐。无论是开发桌面应用、Web应用还是移动应用(尤其是Android应用),Java都占据着重要的地位。为了能够顺利...

    公卫执业医师 环境卫生学试题及答案.doc

    环境卫生学是公共卫生领域的重要组成部分,主要研究环境因素对人体健康的影响,以及如何预防和控制环境因素导致的健康问题。以下是对题目中涉及的一些知识点的详细解释: 1. 微量元素的剂量效应曲线:微量元素的...

    Linux平台RTOS通用仿真环境的设计与实现.pdf

    1. **平台无关性**:针对不同的RTOS(如uC/OS-II和FreeRTOS),设计的仿真环境应能抽象掉硬件的具体细节,实现对多种RTOS的支持,使它们能够在Linux环境下正常运行。 2. **虚拟抽象层**:Linux Virtual Abstract ...

Global site tag (gtag.js) - Google Analytics