Golang 환경변수 등록 소스

딱히 뭐 없고 이전에 만들었던 “Go 환경변수 등록해주는 프로그램” 이걸 golang으로 작업해봄.
주목적은 golang에서 registry 처리하는거 테스트 하다가 덤으로 만들어진 프로그램

 


2020년 7월 26일 수정

윈도우 재설치 하고 golang sdk도 업그레이드 하다가 실수로 폴더 통채로 날려서 환경설정.exe 파일이 날라가는걸 경험하고 살짝 업그레이드 함.

이전처럼 실행 경로를 기준으로 잡지 않고 json 설정파일을 지정해서 내부에 있는 경로를 가져다 등록하는것으로 변경함.

//https://pkg.go.dev/golang.org/x/sys/windows/registry?tab=doc
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"

	"golang.org/x/sys/windows/registry"
)

type Config struct {
	GOROOT  string //Golang SDK 루트폴더 ex) C:\SDK\Go
	GOPATH  string //go프로젝트 루트폴더 ex) C:\Projects\Go
	GitPath string //Git 루프폴더 ex) C:\Portables\Git
}

var config Config

func Init() {

	//기본 설정파일을 읽어들인다. 없음 하나 만들라고 알림 띄워주고
	fp, err := os.Open("./golangSetEnvironmentVariables.json")
	if err != nil {
		fmt.Println("golangSetEnvironmentVariables.json 파일이 없습니다.")

		config := Config{GOROOT: `C:\SDK\Go`, GOPATH: `C:\Projects\Go`, GitPath: `C:\Portables\Git`}
		jsonBytes, err := json.Marshal(config)
		if err != nil {
			panic(err)
		}
		fo, err := os.Create("./golangSetEnvironmentVariables.default.json")
		if err != nil {
			panic(err)
		}
		defer fo.Close()

		_, err = fo.Write(jsonBytes)
		if err != nil {
			panic(err)
		}
		fmt.Println("golangSetEnvironmentVariables.default.json 파일을 생성했습니다.")
		fmt.Println()
		fmt.Println("json 파일을 열어서 GOROOT, GOPATH, GitPath... 각 경로를 수정하세요")
		fmt.Println("파일명을 golangSetEnvironmentVariables.json으로 변경후 다시 실행하세요.")

		os.Exit(0)
	}
	defer fp.Close()
	bytes, _ := ioutil.ReadAll(fp)

	err = json.Unmarshal(bytes, &config)

	fmt.Println("GOROOT 경로 = " + config.GOROOT)
	fmt.Println("GOPATH 경로 = " + config.GOPATH)
	fmt.Println("Git 경로 = " + config.GitPath)
	fmt.Println()

}

func main() {

	Init()

	//---------------------------------------------------------------------------------------------
	//레지스트리 오픈
	regKey, err := registry.OpenKey(registry.CURRENT_USER, "Environment", registry.ALL_ACCESS)
	if err != nil {
		fmt.Println("Regkey 오픈실패")
		log.Fatal(err)
	}
	defer regKey.Close()

	//---------------------------------------------------------------------------------------------
	//1. GOROOT를 추가한다. (ex: C:\SDK\Go)
	err = regKey.SetStringValue("GOROOT", config.GOROOT)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("GOROOT 추가 완료 : ", config.GOROOT)

	//---------------------------------------------------------------------------------------------
	//2. GOROOT\bin 폴더 경로를 %Path%에 추가한다. (ex: C:\SDK\Go\bin)
	strPath, _, err := regKey.GetStringValue("path")
	if err != nil {
		log.Fatal(err)
	}
	strPath += config.GOROOT + `\bin;`

	err = regKey.SetStringValue("path", strPath)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(`GOROOT\bin 추가 완료 : `)

	//---------------------------------------------------------------------------------------------
	//3. GOPATH를 추가한다.(ex: C:\Projects\Go )
	err = regKey.SetStringValue("GOPATH", config.GOPATH)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("GOPATH 추가 완료 : ", config.GOPATH)

	//---------------------------------------------------------------------------------------------
	//4. Git\bin 폴더 경로를 %Path%에 추가한다. (ex: C:\Portables\Git\bin)
	strPath, _, err = regKey.GetStringValue("path")
	if err != nil {
		log.Fatal(err)
	}
	strPath += config.GitPath + `\bin;`

	err = regKey.SetStringValue("path", strPath)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(`GitPath\bin 추가 완료 : `)
	//---------------------------------------------------------------------------------------------
}
크리에이티브 커먼즈 라이선스 Linsoo 의 저작물인 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스 에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.