Go로 Wandbox에 코드를 보내서 실행 결과를 보십시오

15636 단어 WandboxGo

개시하다


이것은 Go3 Advent Calendar 2017 다음날의 문장이다.
[Day 1 | 베스트셀러 내용을 한꺼번에 골라내다] <<기사>[Day3|cgo에서 포인터 전달]
CLI를 하려고 Go를 만지기 시작했다.
Wandbox에 로컬 코드를 보내고 실행 결과를 얻을 수 있는 도구를 만들었습니다.
다행히도 Wandbox의 API가 공개됐기 때문에 코드 등 json으로 만든 물건을 보내서 실행 결과를 표시하는 도구입니다.

상관없을 수도 있고, 중요한 정보일 수도 있다

  • 사용 편집기: VScode
  • Go의 버전: Go1.9

  • 사용된 패키지
  • https://github.com/urfave/cli
  • https://github.com/mattn/go-colorable

  • 테스트 환경: CircleaCI 2.0
  • gootest,goverage,go-juniit-report 등을 사용했다
  • Go를 선택한 이유

  • C++는 극단적이지만 C++로 절대 만들고 싶지 않아
  • 교차 번역이 쉽다
  • 도구 완비
  • 어떤 잘생긴 남자의 소문을 들은 것 같다
  • 아무래도 새로운 언어를 해보고 싶은 생각이 든다
  • "CLI를 하려고 하는데 추천하는 언어가 있나요?"(이것이 결정적 요인
  • Wandbox


    wandbox는 온라인 컴파일러입니다.
    다양한 언어의 컴파일러 버전이 있습니다.

    CBT(Cranberries Build Tool)


    CBT는 이번에 제작된 CLI의 이름이다.
    가능하면 코드를 Wandbox에 보내서 실행 결과를 볼 수 있습니다.
    죄송합니다. 대응 언어는 C, C++, Go뿐입니다.
    C++만 기본적으로 만족하기 때문에 대응 언어를 늘릴 여력이 없다.
    누가 홍보 좀 해주세요.
    코드가 혼돈적이어서 이번 기사는 등장하지 않았다.
    보고 싶은 사람은 깃허브를 보세요.
    창고는여기.입니다.
    go get github.com/LoliGothick/cbt
    
    소스를 없앨 수 있어요.
    패스가 있으면 goo install에서 사용할 수 있습니다.
    먼저 GiitHub의 releases에서 이진법을 줄일 수 있다.

    사용법


    현지에서 일하면서 이해할 수 없는 번역 오류에 30분 동안 머리를 감싸고 있다.
    알아봐도 원인도 모르고 머리 아픈 너.
    트위터에서 탄식하는 사이 "전선을 보여주세요"라는 구원의 손길!
    그럴 때 어떻게 할 거예요?
    기스트에 붙여요?
    서류 하나면 돼요. 많으면 좀 귀찮아요.
    한 번에 wandbox에 코드를 공개하면 편리하겠죠.
    할 수 있어!
    CBT라면.

    Basic Usage


    너는 종착역을 조작하고 있다.
    현재 디렉토리에 다음 Go 코드가 있다고 가정합니다.
    hello.go
    package main
    
    import (
            "fmt"
    )
    
    func main() {
            fmt.Println("Hello, Wandbox!")
    }
    
    그리고 터미널에서 아래처럼 cbt의wandbox 명령을 두드리면 실행 결과가 표시됩니다.
    언어를 지정하려면 하위 명령이 필요합니다.
    $ cbt wandbox go ./hello.go
    Hello, Wandbox!
    

    Commands & Options


    정규 지령은 wandbox뿐이다.
    옵션은 Wandbox 옵션을 지정합니다.

    C++ 말이 많아요.Go에는 컴파일러, 런타임 옵션, 표준 입력만 있습니다.
    cbt -h
    
    명령을 확인할 수 있습니다.
    cbt [command] -h
    
    명령 옵션을 확인할 수 있습니다.
    wandboxgo의 명령은 다음과 같습니다.
    urfave/cli는 자동으로 생성되기 때문에 편리합니다.
    $ cbt wb go -h
    NAME:
       cbt wandbox go - Go
    
    USAGE:
       cbt wandbox go [command options] [arguments...]
    
    OPTIONS:
       --compiler value, -x value        specify Go version [fmt: go-x.x] (default: "go-head")
       --compile-option value, -c value  specify compiler options
       --runtime-option value, -r value  specify runtime options
       --stdin value, --in value         specify standard input [text or file both accept]
       --save, -s                        publishing permanent link
    
    
    
    
  • --compiler, -x
    : 컴파일러 버전 지정
  • example
    -x=go-1.9
    
  • --runtime-option,-r: 실행 시간 옵션 지정
  • 무엇을 지정할 수 있습니까?
  • --save,-s:Wandbox의 파마 링크 발행
  • 결과를 실행하면 파마 링크와 URL이 표시됩니다.
    $ cbt wandbox go hello.go -s
    Hello, Wandbox!
    
    
    Permlink: Yi5yI5OtL7QGczvl
    URL: https://wandbox.org/permlink/Yi5yI5OtL7QGczvl
    

    여러 파일


    Wandbox는 여러 파일을 쓸 수 있기 때문에 여러 파일이 있으면 바로 보낼 수 있다.

    C/C++ 시


    명령은 여러 개의 원본 코드를 컴파일할 수 있다.

    $ cbt wandbox cpp main.cpp func.cpp
    
    이렇게 여러 개의 원본 파일을 지정할 수 있습니다.
    wandboxgo 명령을 사용할 수 없습니다.

    분석 머리글

    #include <hoge>표준 라이브러리라서 그래요.#include "hoge"의include 파일을 열고 정규 표현식으로 검색합니다.
    디렉터리는 발굴만 할 수 있으며, 파일이main 함수를 가진 파일 경로 위에 놓일 때 문제가 발생하기 때문에main 함수를 가진 파일 경로로 모두 전개됩니다.
    같은 파일 이름을 밑줄로 바꿉니다.
    예컨대
    main.cpp
     ├ include/hoge.hpp
      |  └ hoge/hoge.hpp
     └ src/hoge.cpp
    
    이렇게 돼도 웬드박스에 보내면 평평해진다.
    main.cpp
    hoge.hpp
    hoge_.hpp
    hoge.cpp
    

    go의 상황


    import의 해석


    Go의 import은 표준 라이브러리 또는 GOPATH 아래에 있습니다.
    먼저 GOPATH의 디렉토리를 분석합니다.
    import 파일의 GOPATH에 존재하는 파일을 Wandbox 측면의 GOPATH로 바꿉니다.
    여러 개의 GOPATH를 설정할 가능성을 고려하다.

    실장할 때 힘든 일


    입문의 고생


    Go는 복잡한 기능이 무자비하게 버려진 것처럼 느껴지는 좋은 언어다.
    그래서 고 자체는 간단하고, 입문도 힘들지 않다.
    역시 고답게 왓박스에 포스터를 보내고 싶은 부분은 조사해도 1시간 만에 완성됐다.

    Wandbox 방법을 연구하는 수고


    물론 GiitHub에서 API의 설명을 읽었을 뿐 아무것도 모른다.
    근거
    $ curl https://wandbox.org/api/list.json
    
    하다
    나는 1만 4천 줄의 제이슨을 읽었다.
    그리고 C++로 다목적 컴파일을 하기 위해compuiler-options에서 원본 파일을 나열하는 방법을 시도했습니다.
    Wandbox가 할 수 있는 일, 할 수 없는 일을 찾고 있다는 얘기다.
    여기서 일주일을 녹였다.

    파일 분석의 수고


    파일의 해석과 파일 경로 교체를 포함합니다.
    그저 귀찮기만 하다.
    이거 쓰고 싶었어.

    테스트


    C1을 덮어쓰려는 망라시험의 흔적이 있습니다.
    대체로 다음과 같은 느낌.
    테스트에 편리하도록 테스트런을 제작해 테스트 용례를 구조체로 만들어 전자레인지로 돌렸는데 여러분은 어떻게 하셨을까.
    func TestWandboxCpp(t *testing.T) {
        cases := []test.TestPattern{
            {In: `cbt wandbox cpp ./test_samples/cpp/multi.cpp ./test_samples/cpp/func.cpp`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -x=clang-head`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -w`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -v`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -o`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -msgpack`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -boost=1.65.1`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -p=no`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -p=yes`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -p=errors`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -p=no -bash`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -p=yes -bash`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -p=errors -bash`, Out: `Hello, cbt`, Err: nil},
            {In: `cbt wandbox cpp ./test_samples/cpp/simple_test.cpp -x=clang-head -w -v -o -msgpack -boost=1.65.1 -p=errors -bash`, Out: `no newline`, Err: nil},
        }
        for _, test := range cases {
            out, err := core.NewCLI().TestRun(strings.Split(test.In, " "))
            if !regexp.MustCompile(test.Out).Match(out) || !reflect.DeepEqual(test.Err, err) {
                t.Errorf("cbt (%q)\nout: %v, %v\nrequire: %v, %v",
                    test.In, string(out), err, test.Out, test.Err)
            }
        }
    }
    
    
    아무래도 좀 그럴 것 같은 단원 시험도 치르고 있고요.
    최근 덮어쓰기.

    발포


    goreleaser 명령이 떨어지자마자 GiitHub에 발표되었다.
    가장 가볍다.
    다만, goreleaser는 제어 문자로 출력에 색을 칠하는 간단한 것.
    Windows에서 유감을 표시합니다.
    ↵[033mhoge↵[0m
    
    이런 녀석
    mattn/go-colorable 한 줄로 고쳐서 예뻐졌어요.
    귀찮아서 홍보 안 해요.

    총결산


    명령줄에서 여러 파일로 구성된 코드를 wandbox에 간단하게 보낼 수 있습니다.

    좋은 웹페이지 즐겨찾기