Committing Machine Specific Configuration Files

后端 未结 10 1379
我在风中等你
我在风中等你 2020-11-22 06:43

A common scenario when I develop is that the codebase will have several config files which require machine specific settings. These files will be checked into Git and other

10条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-22 07:11

    I agree with the best answer but also would like add something. I use an ANT script to strip & modify files from the GIT repo so I'm sure no production files get overwritten. There is a nice option in ANT to modify java-property files. This means putting your local test variables in a java-style property file and adding some code to process it, but it gives you the opportunity to automate building your site before you FTP it online. Typically you would put your production information in the site.default.properties file, and let ANT manage the settings. Your local settings would be in the site.local.properties.

         command to change some parameters while building.
     * @author martin
     *
     */
    class javaPropertyFileReader {
    
        private $_properties;
        private $_validFile;
    
        /**
         * Constructor
         * @return javaPropertyFileReader
         */
        public function   __construct(){
            $this->_validFile = false;
            return $this;
        }//__construct
    
        /**
         * Reads one or both Java style property files
         * @param String $filenameDefaults
         * @param String $filenameLocal
         * @throws Exception
         * @return javaPropertyFileReader
         */
        public function readFile($filenameDefaults, $filenameLocal = ""){
    
            $this->handleFile($filenameDefaults);
            if ($filenameLocal != "") $this->handleFile($filenameLocal);
        }//readFile
    
        /**
         * This private function will do all the work of reading the file and  setting up the properties
         * @param String $filename
         * @throws Exception
         * @return javaPropertyFileReader
         */
        private function handleFile($filename){
    
        $file = @file_get_contents($filename);
    
        if ($file === false) {
             throw (New Exception("Cannot open property file: " . $filename, "01"));
        }
        else {
            # indicate a valid file was opened
            $this->_validFile = true;
    
            // if file is Windows style, remove the carriage returns
            $file = str_replace("\r", "", $file);
    
            // split file into array : one line for each record
            $lines = explode("\n", $file);
    
            // cycle lines from file
            foreach ($lines as $line){
                $line = trim($line);
    
                if (substr($line, 0,1) == "#" || $line == "") {
                    #skip comment line
                }
                else{
                    // create a property via an associative array
                    $parts   = explode("=", $line);
                    $varName = trim($parts[0]);
                    $value   = trim($parts[1]);
    
                    // assign property
                    $this->_properties[$varName] = $value;
                }
            }// for each line in a file
        }
        return $this;
        }//readFile
    
        /**
         * This function will retrieve the value of a property from the property list.
         * @param String $propertyName
         * @throws Exception
         * @return NULL or value of requested property
         */
        function getProperty($propertyName){
            if (!$this->_validFile) throw (new Exception("No file opened", "03"));
    
            if (key_exists($propertyName, $this->_properties)){
                return $this->_properties[$propertyName];
            }
            else{
              return NULL;
            }
        }//getProperty
    
        /**
         * This function will retreive an array of properties beginning with a certain prefix.
         * @param String $propertyPrefix
         * @param Boolean $caseSensitive
         * @throws Exception
         * @return Array
         */
        function getPropertyArray($propertyPrefix, $caseSensitive = true){
            if (!$this->_validFile) throw (new Exception("No file opened", "03"));
    
            $res = array();
    
            if (! $caseSensitive) $propertyPrefix= strtolower($propertyPrefix);
    
            foreach ($this->_properties as $key => $prop){
                $l = strlen($propertyPrefix);
    
                if (! $caseSensitive) $key = strtolower($key);
    
                if (substr($key, 0, $l ) == $propertyPrefix) $res[$key] = $prop;
            }//for each proprty
    
            return $res;
        }//getPropertyArray
    
        function createDefineFromProperty($propertyName){
            $propValue = $this->getProperty($propertyName);
            define($propertyName, $propValue);
        }//createDefineFromProperty
    
    
        /**
         * This will create a number of 'constants' (DEFINE) from an array of properties that have a certain prefix.
         * An exception is thrown if 
         * @param  String $propertyPrefix
         * @throws Exception
         * @return Array The array of found properties is returned.
         */
        function createDefinesFromProperties($propertyPrefix){
            // find properties
            $props = $this->getPropertyArray($propertyPrefix);
    
            // cycle all properties 
            foreach($props as $key => $prop){
    
                // check for a valid define name
                if (preg_match("'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'", $key)) {
                    define($key, $prop);
                }   
                else{
                    throw (new Exception("Invalid entry in property file: cannot create define for {" . $key . "}", "04"));
                }   
            }// for each property found
    
            return $props;
        }//createDefineFromProperty
    
    }//class javaPropertyFileReader
    

    then use it:

      $props = new javaPropertyFileReader();
      $props->readFile($_SERVER["DOCUMENT_ROOT"] . "/lib/site.default.properties",$_SERVER["DOCUMENT_ROOT"] . "/lib/site.local.properties");
    
      #create one DEFINE
      $props->createDefineFromProperty("picture-path");
    
      # create a number of DEFINEs for enabled modules
      $modules = $props->createDefinesFromProperties("mod_enabled_");
    

    Your site.default.properties would look like:

    release-date=x
    environment=PROD
    picture-path=/images/
    
    SITE_VERSION_PRODUCTION=PROD
    SITE_VERSION_TEST=TEST
    SITE_VERSION_DEVELOP=DEV
    
    # Available Modules
    mod_enabled_x=false
    mod_enabled_y=true
    mod_enabled_z=true
    

    and your site.local.properties would look like (notice the difference environment and enabled modules):

    release-date=x
    environment=TEST
    picture-path=/images/
    
    SITE_VERSION_PRODUCTION=PROD
    SITE_VERSION_TEST=TEST
    SITE_VERSION_DEVELOP=DEV
    
    # Available Modules
    mod_enabled_x=true
    mod_enabled_y=true
    mod_enabled_z=true
    

    And your ANT instructions: ($d{deploy} being your deployment target directory)

    
        
        
    
    

提交回复
热议问题