@jennyhilton конечно, рад поболтать дальше.

ужно создатьbash.sh файл из программы golang, который должен делать следующее:

СоздайтеДля каждого цикл на зависимости и читать тип и в соответствии с типом печатать различные эхо-сообщения (команды) мне нужно с ним работатьпереключатель наtype зависимости от Голанга

например что-то вроде следующего

Для каждой записи зависимости добавьте сообщение типа echo

#!/bin/bash
for a in $(dependencies.type) 
  echo $runner  //from type 
done

то, что я сделал, это то, что не работает

Идея, что для типа зависимостей"Runner1"(см. значение свойства type в экземпляре структуры зависимости) Мне нужно запуститьнесколько команд и для"Runner2" Мне нужно бежатьнесколько разных командИ те команды (как echo api1 для runner1 и т. Д.) Выше должны быть записаны в bash.script, который мне нужно создать из шаблона

основной пакет

import (
    "fmt"
    "log"
    "text/template"
    "gopkg.in/yaml.v2"
    "os"
)

type File struct {
    TypeVersion string `yaml:"_type-version"`
    Dependency  []Dependency
}

type Dependency struct {
    Name    string
    Type    string
    CWD     string
    Install []Install
}

type Install map[string]string

var data = `
_type-version: "1.0.0"
dependency:
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api

  - name: ui2
    type: runner2
    cwd: /ui2
    install:
       - name: api2

`

func main() {
    f := File{}

    err := yaml.Unmarshal([]byte(data), &f)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

    d, err := yaml.Marshal(&f)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("--- t dump:\n%s\n\n", string(d))

    wd, _ := os.Getwd()

    newfile, err := os.Create(wd + "/" + "bash.sh") // Truncates if file already exists
    if err != nil {
        fmt.Errorf("Failed to create file: %s , %s", wd+"/"+"bash.sh", err)
    }

    fmt.Println(newfile)

    const File = `
#!/bin/bash
{{.dependency}},
{{if .Type runner2}}
 echo "type is runner2"
{{- else}}
echo "type is %S"
{{- end}}
{{end}}
`

    t := template.Must(template.New("bash.sh").Parse(File))

    for _, r := range f.Dependency {
        err := t.Execute(os.Stdout, r)
        if err != nil {
            log.Println("executing template:", err)
        }
    }

}

Обновить

Например

допустим, у меня есть карта, подобная следующей, и структура зависимостей должна работать со структурой API, чтобы знать, какую команду выполнять для каждого значения типа

API := map[string]string {
{
“runner1” : “api1”,
},
{
“runner2” : “api2”,
}
}

Вот как должен выглядеть скрипт в конце

#bin/bash

// in context of dep1
echo runner1
submitting api1


// in context of dep2
echo runner2
submitting api2
 mkopriva15 апр. 2018 г., 15:25
@JennyHilton Вы ищете что-то подобное?play.golang.org/p/v65jr0Hr5v2
 mkopriva16 апр. 2018 г., 17:09
Пожалуйста, прочитайте документы здесь:golang.org/pkg/text/template Все ваши потребности шаблона объяснены там в четких деталях. Пожалуйста, поймите, что важно приложить некоторые усилия для решения проблемы самостоятельно. Я здесь, потому что я пытаюсь помочь и учиться, я здесь не для того, чтобы работать бесплатно.
 Keith01 окт. 2017 г., 12:13
Посмотрите здесь,github.com/expressjs/session когда у вас есть обработчик сеанса, вы можете просто сделать что-то вроде ->req.session.aaa = req.body.aa..
 Jenny Hilton15 апр. 2018 г., 15:37
@mkopriva - Спасибо, мне нужны две вещи: 1. сгенерировать bash.script с результатами шаблона 2. для каждой записи (типа зависимостей) мне нужно вызвать как echo api1, а для второго echo api2 это в инсталляции объект.
 Keith01 окт. 2017 г., 12:09
Возможно, вы захотите использовать сеанс для этого, потому что то, что вы сделали здесь, не будет работать и для многопользовательского режима.

Ответы на вопрос(1)

необходимые для работы над вышеперечисленным:

package main

import (
    "log"
    "text/template"
    "gopkg.in/yaml.v2"
    "os"
)

type File struct {
    TypeVersion string `yaml:"_type-version"`
    Dependency  []Dependency
}

type Dependency struct {
    Name    string
    Type    string
    CWD     string
    Install []Install
}

type Install map[string]string

var data = `
_type-version: "1.0.0"
dependency:
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api

  - name: ui2
    type: runner2
    cwd: /ui2
    install:
       - name: api2

`

func main() {
    f := File{}

    err := yaml.Unmarshal([]byte(data), &f)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

   const t = `
#!/bin/bash

{{range .Dependency}}
echo "type is {{.Type}}"
echo "cwd is {{.CWD}}"
{{range .Install}}
echo "install {{.name}}"
{{end}}
{{end}}
`

    tt := template.Must(template.New("").Parse(t))
    err = tt.Execute(os.Stdout, f)
    if err != nil {
        log.Println("executing template:", err)
    }
}

Это производит

$ go run main.go 

#!/bin/bash


echo "type is runner"
echo "cwd is /ui"

echo "install api"


echo "type is runner2"
echo "cwd is /ui2"

echo "install api2"

Главное изменение состоит в том, чтобы позволить шаблону выполнить работу - использовать функцию диапазона в массиве Dependency, а затем снова в массиве Install, чтобы пересечь структуру данных.

Другое изменение - это просто запись в стандартный вывод, а не в файл. Если желательно превратить это в скрипт, просто передайте его в файл.

В более широком смысле, я думаю, что в модели данных существует напряженность вокруг владения шагами установки. Установлены ли шаги установки для каждого типа бегуна? Или они могут отличаться? Если они исправлены, то, вероятно, имеет смысл иметь отображение [string] [string] типа бегунка в массив шагов установки, что бы освободило объект Dependency от копии шагов установки.

Я также задаюсь вопросом о YAML - это источник правды? Или это производная? Если производная, возможно, она не нужна. Вероятно, лучше, чтобы программа go опрашивала фактический источник правды и генерировала скрипт.

В любом случае, я надеюсь, что это полезно.

 Jonah Benton22 апр. 2018 г., 14:27
@jennyhilton конечно, рад поболтать дальше.
 Jenny Hilton22 апр. 2018 г., 12:39
Я не был в состоянии проверить это надежно, я дам вам очки, и у меня есть несколько вопросов, надеюсь, вы можете помочь ... спасибо

Ваш ответ на вопрос