Fragmenta의 각서
보이는
회사 정책으로 Go 언어를 시작했습니다.
손쉽게 빨리 쓰는 법을 기억하기 위해 뭔가 오픈 소스의 제품을 읽어 보자, 익숙한 곳에서 CMS 주변을 찾아 보았는데 ... Fragmenta라는 것을 발견했습니다.
라고 할까, 그것 밖에 발견되지 않았기 때문에 시도해보기로 했습니다.
덧붙여서, 쓰기시 버전은 1.5rc입니다.
Fragmenta란?
golang에서 만든 CMS 같다.
다만, 내용을 보면 어플리케이션을 만드는 프레임워크로서 사용되는 것도 의식하고 있는 것 같습니다.
설정
지난번 의 계속이므로, 계속해서 cloud9로 시험하고 있습니다.
문서 하지만, 지금은 정확하지 않은 것 같기 때문에, 시도해 본 순서를 기억하면서 써 갑니다.
설치
$ go get -u github.com/fragmenta/fragmenta
$ fragmenta help
------
Fragmenta version: 1.5rc
fragmenta version -> display version
fragmenta help -> display help
fragmenta new [app|cms|blog|URL] path/to/app -> creates a new app from the repository at URL at the path supplied
fragmenta -> builds and runs a fragmenta app
fragmenta server -> builds and runs a fragmenta app
fragmenta test -> run tests
fragmenta migrate -> runs new sql migrations in db/migrate
fragmenta backup [development|production|test] -> backup the database to db/backup
fragmenta restore [development|production|test] -> backup the database from latest file in db/backup
fragmenta deploy [development|production|test] -> build and deploy using bin/deploy
fragmenta generate resource [name] [fieldname]:[fieldtype]* -> creates resource CRUD actions and views
fragmenta generate migration [name] -> creates a new named sql migration in db/migrate
------
헬프의 모습이라면, cms를 작성하는 것 이외에, 어플리케이션의 스켈레톤이나 블로그를 만드는 일도 할 수 있을 것 같습니다.
URL이 있는 것은 리포지토리로부터 신규 프로젝트를 만든다는 곳입니까.
PHP의 패키저, Composer에서도 다른 사람이 만든 프로젝트 템플릿에서 새롭게 프로젝트를 만들거나 할 수 있었기 때문에, 그러한 사용법을 생각하고 있는 것은 아닐까? 라고 생각합니다.
먼저 앱을 사용해 보겠습니다.
# GOPATHをworkspace/に設定しているので、src以下で開発
$ cd src
# とりあえずローカルで試すだけなので、app_testとしておいた
$ fragmenta new app app_test
$ cd app_test
$ tree
├── bin
├── db
│ ├── backup
│ └── migrate
│ ├── 2017-05-27-072519-Create-Database.sql
│ └── 2017-05-27-072519-Create-Tables.sql
├── log
├── public
│ ├── assets
│ │ ├── images
│ │ │ └── app
│ │ │ └── logo.png
│ │ ├── scripts
│ │ │ └── app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.min.js
│ │ └── styles
│ ├── app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.min.css
│ └── normalize.min.css
├── secrets
│ ├── assets.json
│ └── fragmenta.json
├── server.go
├── server_test.go
└── src
├─ app
...
디폴트라면 sql등 있으므로, 사용하지 않아도 데이타베이스가 필요한 것 같습니다.
mysql 서버 설정
$ mysql-ctl install
MySQL 5.5 database added. Please make note of these credentials:
Root User: username
Database Name: c9
설치하면 사용자 이름과 기본적으로 만들어진 데이터베이스 이름이 표시됩니다.
username은 초기에 환경 변수 C9_USER가 될 것 같습니다.
mysql 서버 시작 및 확인
$ mysql-ctl start
$ mysql-ctl cli
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| c9 |
| mysql |
| performance_schema |
| phpmyadmin |
+--------------------+
5 rows in set (0.01 sec)
설정 등은 secrets/fragmenta.json에있는 것 같습니다.
$ cat secrets/fragmenta.json
{
"development": {
"assets_compiled": "no",
"db": "c9",
"db_adapter": "mysql",
"db_pass": "",
"db_user": "username",
"hmac_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"log": "log/development.log",
"path": "app_test",
"port": "8080",
"secret_key": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
},
...
host의 지정이 없습니다만, 가볍게 소스를 보고 본 한이라면, 설정할 수 있을 것 같습니다.
htps : // 기주 b. 이 m/f등 g면/쿠에 ry/bぉb/마s r/아다 p rs/다바세_mysql. #L20
포트 번호는, 전회 본대로, 8080으로 설정해 두는 것이 좋습니다.
$ cat secrets/assets.json
{
"app": {
"scripts": "d0d2a631d0b5b2e52b6def992031e9fd1309a66d",
"styles": "58a0afbf47fbb0647dc34dff83732be2509c4c7e",
"files": {
"src/app/assets/styles/admin.css": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/app/assets/scripts/adom.js": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/app/assets/styles/app.css": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/app/assets/scripts/app.js": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/lib/editable/assets/styles/editable.css": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/lib/editable/assets/scripts/editable.js": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/users/assets/styles/users.css": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"src/users/assets/scripts/users.js": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
같은 디렉토리에 있으면 CSS와 같은 파일이 지정됩니다.
내용을 압축하여 배치하는 설정인 것 같습니다.
$ ls db/migrate
2017-05-27-072519-Create-Database.sql* 2017-05-27-072519-Create-Tables.sql*
$ cat 2017-05-27-072519-Create-Database.sql
/* Setup database for app_test */
CREATE USER "app_test_server" WITH PASSWORD 'xxxxxxxxxxx';
CREATE DATABASE "app_test_development" WITH OWNER "app_test_server";
fragmenta migrate로 미그레이트하는 것 같지만, 사용자나 데이터베이스를 작성하는 것 같기 때문에, Create-Tables.sql의 내용을 데이터베이스에 흘려 둡니다.
fragmenta test로 테스트를 할 수 있는 것 같습니다만, 데이터베이스 작성의 테스트등도 있기 때문에, 이번은 날립니다.
$ fragmenta server
06:39:07
------
Fragmenta version: 1.5rc
------
06:39:07 Building server...
06:39:07 Running go fmt at ./...
06:39:09 Building server at /home/ubuntu/workspace/src/app_test/bin/fragmenta-server-local
06:39:10 Build completed successfully in 1.368860262s
06:39:10 Launching server...
2017/06/04 06:39:10 #info Opened log file at log/development.log
2017/06/04 06:39:10 #info Finished loading assets in 96.379µs
2017/06/04 06:39:10 #info Finished loading templates in 3.761767ms
2017/06/04 06:39:10 #info Finished opening in 1.398579ms database c9 for user username
2017/06/04 06:39:10 #info Starting server in Development mode on port 8080
이제
https://{projectname}-{username}.c9users.io
방문하면 톱 페이지가 표시됩니다.
라우터 설정
$ cat src/app/routes.go
package app
import (
"github.com/fragmenta/router"
"app_test/src/users/actions"
)
// SetupRoutes adds routes for this app to this router.
func SetupRoutes(r *router.Router) {
// Resource Routes
r.Add("/users", useractions.HandleIndex)
r.Add("/users/create", useractions.HandleCreateShow)
r.Add("/users/create", useractions.HandleCreate).Post()
r.Add("/users/{id:[0-9]+}/update", useractions.HandleUpdateShow)
r.Add("/users/{id:[0-9]+}/update", useractions.HandleUpdate).Post()
r.Add("/users/{id:[0-9]+}/destroy", useractions.HandleDestroy).Post()
r.Add("/users/{id:[0-9]+}", useractions.HandleShow)
r.Add("/users/login", useractions.HandleLoginShow)
r.Add("/users/login", useractions.HandleLogin).Post()
r.Add("/users/logout", useractions.HandleLogout).Post()
r.Add("/users/password", useractions.HandlePasswordReset)
r.Add("/users/password/reset", useractions.HandlePasswordResetShow)
r.Add("/users/password/reset", useractions.HandlePasswordResetSend).Post()
r.Add("/users/password/sent", useractions.HandlePasswordResetSentShow)
// Set the default file handler
r.FileHandler = fileHandler
r.ErrorHandler = errHandler
// Add a files route to handle static images under files
// - nginx deals with this in production - perhaps only do this in dev?
r.Add("/files/{path:.*}", fileHandler)
r.Add("/favicon.ico", fileHandler)
// Add the home page route
r.Add("/", homeHandler)
}
위의 마지막부터, 톱 페이지는 homeHandler가 담당하고 있다는 것을 알기 때문에, 보겠습니다.
$ cat src/app/home.go
package app
import (
"github.com/fragmenta/router"
"github.com/fragmenta/view"
)
// HandleShowHome serves our home page with a simple template.
// This function might be moved over to src/pages if you have a pages resource.
func homeHandler(context router.Context) error {
view := view.New(context)
view.AddKey("title", "Fragmenta app")
view.Template("app/views/home.html.got")
return view.Render()
}
템플릿에 app/views/home.html.got을 사용하는 것 같습니다.
$ cat src/app/views/home.html.got
<section class="padded">
<h1>{{.title}}</h1>
<p>A bare-bones app template</p>
</section>
여기 A bare-bones app template를 다시 작성하면 톱 페이지가 다시 작성됩니다.
감상
여기에서는 쓰고 있지 않습니다만, 문서대로 진행해 봐도 동작하지 않거나, Windows에서 시험해 보면 생성되는 패스가 올바르게 없기 때문에 동작하지 않거나 라고 미비가 눈에 띈다.
커뮤니티에도 아직 활기가 없는 느낌입니다만, Go의 오픈 소스제 CMS는 지금의 곳, 그 밖에 없을 것 같기 때문에, 무언가의 계기로 브레이크 하는 것은 아닐까요?
(라고 말하면서, 이번에는 CMS까지 움직일 수 없지만, 또 다른 기회에 시도해 보겠습니다.)
Reference
이 문제에 관하여(Fragmenta의 각서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yookihiroo/items/6166f9c70c3b7232ef67텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)