Haskell 프로젝트 제작 방법(기본) 2021년판 추천
개시하다
(조금만 더) 새해를 축하합니다.
이 글은 내가 2020년 12월 31일에 추천한 최신 Haskell 프로젝트의 제작 방법을 총결하였다.
Haskell의 환경 구축은 Stack을 사용하는 것과 cabal을 사용하는 두 가지가 있다.
역사상 cabal을 개선하는 데 불편한 것은 Stack이다. 현재 cabal도 진화하고 있다.
불편한 점이 대폭 사라졌기 때문에 필자의 취향에 따라 cabal의 환경 구조를 정리했다.
도구 설치
ghcup
ghcup은 GHC, cabal 및 HLS의 버전 관리를 위한 설치 프로그램입니다.
설치설치 가이드를 참조하십시오.
버전 확인
ghcup을 설치한 후
실행
ghcup list
.사용 가능한 도구의 버전을 표시합니다.$ ghcup list
Tool Version Tags Notes
✗ ghc 7.10.3 base-4.8.2.0
✗ ghc 8.0.2 base-4.9.1.0
✗ ghc 8.2.2 base-4.10.1.0
✗ ghc 8.4.1 base-4.11.0.0
✗ ghc 8.4.2 base-4.11.1.0
✗ ghc 8.4.3 base-4.11.1.0
✗ ghc 8.4.4 base-4.11.1.0
✗ ghc 8.6.1 base-4.12.0.0
✗ ghc 8.6.2 base-4.12.0.0
✓ ghc 8.6.3 base-4.12.0.0
✗ ghc 8.6.4 base-4.12.0.0 hls-powered
✓ ghc 8.6.5 base-4.12.0.0 hls-powered
✗ ghc 8.8.1 base-4.13.0.0
✓ ghc 8.8.2 base-4.13.0.0 hls-powered
✓ ghc 8.8.3 base-4.13.0.0 hls-powered
✔✔ ghc 8.8.4 recommended,base-4.13.0.0 hls-powered
✗ ghc 8.10.1 base-4.14.0.0 hls-powered
✗ ghc 8.10.2 base-4.14.1.0 hls-powered
✗ ghc 8.10.3 latest,base-4.14.1.0
✗ ghc 9.0.0.20200925 prerelease,base-4.15.0.0
✗ cabal 2.4.1.0
✗ cabal 3.0.0.0
✔✔ cabal 3.2.0.0 latest,recommended
✗ cabal 3.4.0.0-rc4 prerelease
✓ hls 0.6.0 stray
✔✔ hls 0.7.1 latest,recommended
✗ ghcup 0.1.12 latest,recommended
줄마다 첫 번째 문자는 도구가 설치되어 있는지 두 번째 문자가 설치되어 있는지 여부를 나타냅니다.특별한 이유가 없다면 recommended
의것을 선택하세요.ghcup이 최신이 아니면 업그레이드하세요.
ghcup upgrade
설치 로그
GHC는 컴파일러입니다.이번 설치는 8.4.4입니다.
ghcup install ghc 8.4.4
ghcup set ghc 8.8.4
cabal 설치
cabal은 포장 관리자입니다.이번에 3.2를 설치합니다.
ghcup install cabal 3.2.0.0
ghcup set cabal 3.2.0.0
hls 설치
hls는 최근 출시된 IDE 엔진입니다.이번에 0.7.1을 설치한다.
ghcup install hls 0.7.1
ghcup set hls 0.7.1
프로젝트 작성
Github 창고 만들기
우선 지이허브에 창고를 만든다.
README 및.가장 좋은 것은 먼저 gitignore를 만드는 것이다.
제작해서 로컬 크론으로 할게요.
git clone [email protected]:autotaker/start-haskell.git
cd start-haskell
cabal 프로젝트의 초기화
프로젝트의 초기 설정을 진행합니다.
cabal update
cabal init -i
두 번째 명령을 실행하면 서로 항목을 설정할 수 있습니다.몇 가지 요점을 파악하면
다음은 설정 예입니다.
$ cabal init -i
Should I generate a simple project with sensible defaults? [default: y] n
What does the package build:
1) Executable
2) Library
3) Library and Executable
Your choice? 3
What is the main module of the executable:
* 1) Main.hs (does not yet exist, but will be created)
2) Main.lhs (does not yet exist, but will be created)
3) Other (specify)
Your choice? [default: Main.hs (does not yet exist, but will be created)] 1
Please choose version of the Cabal specification to use:
* 1) 1.10 (legacy)
2) 2.0 (+ support for Backpack, internal sub-libs, '^>=' operator)
3) 2.2 (+ support for 'common', 'elif', redundant commas, SPDX)
4) 2.4 (+ support for '**' globbing)
Your choice? [default: 1.10 (legacy)] 4
Package name? [default: start-haskell]
Package version? [default: 0.1.0.0]
Please choose a license:
1) GPL-2.0-only
2) GPL-3.0-only
3) LGPL-2.1-only
4) LGPL-3.0-only
5) AGPL-3.0-only
6) BSD-2-Clause
* 7) BSD-3-Clause
8) MIT
9) ISC
10) MPL-2.0
11) Apache-2.0
12) LicenseRef-PublicDomain
13) NONE
14) Other (specify)
Your choice? [default: BSD-3-Clause]
Author name? [default: autotaker]
Maintainer email? [default: [email protected]]
Project homepage URL? https://github.com/autotaker/start-haskell
Project synopsis? my favorite cabal project example
Project category:
* 1) (none)
2) Codec
3) Concurrency
4) Control
5) Data
6) Database
7) Development
8) Distribution
9) Game
10) Graphics
11) Language
12) Math
13) Network
14) Sound
15) System
16) Testing
17) Text
18) Web
19) Other (specify)
Your choice? [default: (none)]
Application (Main.hs) directory:
* 1) (none)
2) src-exe
3) app
4) Other (specify)
Your choice? [default: (none)] 3
Library source directory:
* 1) (none)
2) src
3) lib
4) src-lib
5) Other (specify)
Your choice? [default: (none)] 2
Should I generate a test suite for the library? [default: y] y
Test directory:
* 1) test
2) Other (specify)
Your choice? [default: test] 1
What base language is the package written in:
* 1) Haskell2010
2) Haskell98
3) Other (specify)
Your choice? [default: Haskell2010]
Add informative comments to each field in the cabal file (y/n)? [default: n] n
Guessing dependencies...
Generating LICENSE...
Generating Setup.hs...
Generating CHANGELOG.md...
Generating src/MyLib.hs...
Generating app/Main.hs...
Generating test/MyLibTest.hs...
Generating start-haskell.cabal...
You may want to edit the .cabal file and add a Description field.
항목 구성을 확인한다.$ tree
.
├── CHANGELOG.md
├── LICENSE
├── Setup.hs
├── app
│ └── Main.hs
├── src
│ └── MyLib.hs
├── start-haskell.cabal
└── test
└── MyLibTest.hs
3 directories, 7 files
git에push로 제출하세요.git add .
git commit -m 'init cabal project'
git push
CI 설정
인권을 얻기 위해 지허브 액션스를 미리 설정하자.
공공 창고는 무료입니다.
Actions 탭을 열면 Haskell이suggest에 눌렸을 것입니다.
Set up this workflow
단추를 누르십시오.ghc와 cabal의 버전을 변경한 후에 제출하세요.
잠시 기다리면 CI에서 구축 및 테스트가 수행됩니다.
CI badge를 만들면 좀 멋있어요.
생성된 URL은 README입니다.MD에 써서 제출하세요.
구성 설정
로컬 구문을 설정합니다.
cabal configure --enable-coverage --enable-document --enable-profiling
파일 생성cabal.project.local
.이 파일은 로컬 구축에 사용되기 때문에 제출할 필요가 없습니다.
profiling: True
coverage: True
library-coverage: True
documentation: True
package *
documentation: True
미리 설명한 경우profiling
: Haskell의 구성 파일을 활성화합니다.실행이 좀 느리지만 설정 파일을 대체할 수도 있고, 창고 추적을 통해 디버깅을 할 수도 있습니다.coverage
: 실행할 때 덮어쓸 수 있습니다.documentation
:haddock 생성.IDE를 사용하여 문서를 표시할 수 있으므로 편리합니다.IDE 설정
이제 IDE 설정을 해보겠습니다.
플러그인 설치
VScode를 넣고 넣기Haskell extension.
작업공간 설정
VScode에서 cabal 프로젝트 디렉터리를 열고 작업공간 설정을 엽니다
사용
Text Editor > Format on save
.작업 설정
구축 또는 테스트를 작업으로 추가합니다.
명령 트레이에서
Tasks: Configure Task
를 선택하면 tasks.json
가 생성됩니다.cabal build
, 등록cabal test
.이렇게 되면
Ctrl + Shift + B
(Mac) 빌딩이 도망갈 것이다.추가 설정
여기까지는 기본적인 설정이다.
여기서부터 개발에 편리한 설정을 소개해 드리겠습니다.
Common stanza
cabal 파일에서library와test로 의존 라이브러리를 각각 기술해야 합니다.
이전의 cabal에서는 끈적끈적한 글자로만 쓸 수 있었기 때문에 아래와 같다
기본적으로 같은 설정을 두 번 써야 하기 때문에 매우 번거롭다.
library
build-depends:
-- long list of dependencies
test-suite start-haskell-test
build-depends:
-- long list of dependencies again
하지만 지금의 cabal은 다르다.Cmd + Shift + B
시작 영역에 공통 설정각 부분의 첫머리글
common ${セクション名}
을 통해 설정을 계승할 수 있다.common shared-properties
default-language: Haskell2010
build-depends:
-- list of common dependencies
library
import: shared-properties
test-suite start-haskell-test
import: shared-properties
build-depends:
-- list of test only dependencies
예시를 작성하여 아래 제출을 확인하세요.자세한 내용은 여기.를 참조하십시오.
hspec-discover
import: ${セクション名}
Haskell 단원 테스트의 공장 표준이다.hspec
도구를 사용하면 테스트 디렉터리 이하의일치하는 모듈
hspec-discover
을 검색하고 각 모듈*Spec.hs
을 실행합니다.설정 예시는 아래 제출을 참고하십시오.
cabal-fmt
cabal 파일에서
spec
와 exposed-modules
에 모듈 목록을 많이 써야 합니다.파일을 추가할 때마다 cabal 파일을 편집하는 것은 매우 번거롭다.이 번거로운 작업을 자동화하는 도구는cabal-fmt이다.
이 도구는
other-modules
파일을 성형할 수 있는 포맷기입니다.디렉터리를 검색하고 모듈 목록을 자동으로 업데이트하는 기능이 있습니다.
설치하다.
사용자의 홈 디렉터리에 설치하면 됩니다.
cd ~
cabal install cabal-fmt
설정
cabal 파일
.cabal
또는 exposed-modules
전에 다음 주석을 삽입합니다.-- cabal-fmt: expand ${ディレクトリ名}
other-modules
의 매개 변수에 expand
를 더하면 특정 모듈을 배제할 수 있다.예를 들어 hspec-Dicover의 Spec 모듈을 추가하면 번거롭기 때문에 다음과 같다.
-- cabal-fmt: expand test -Spec
other-modules: MyLibSpec
실행
-${モジュール名}
옵션을 설정하면 존재하는 cabal 파일을 덮어씁니다.cabal-fmt -i start-haskell.cabal
작업 설정
어렵게 베스코드의task를 추가했으니 건물과 테스트 수행 전에 자동으로 실행합시다.
tasks.json
@@ -3,6 +3,19 @@
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
+ {
+ "label": "cabal-fmt",
+ "type": "shell",
+ "command": "cabal-fmt -i start-haskell.cabal",
+ "presentation": {
+ "echo": true,
+ "reveal": "never",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": true,
+ "clear": false
+ }
+ },
{
"label": "build",
"type": "shell",
@@ -19,7 +32,10 @@
"group": {
"kind": "build",
"isDefault": true
- }
+ },
+ "dependsOn": [
+ "cabal-fmt"
+ ]
},
{
"label": "test",
@@ -37,7 +53,10 @@
"group": {
"kind": "test",
"isDefault": true
- }
- }
+ },
+ "dependsOn": [
+ "cabal-fmt"
+ ]
+ },
]
}
\ No newline at end of file
설정 예시는 아래 제출을 참고하십시오.credle 설정
VScode로 Haskell 파일을 열면 다음 정보가 짜증납니다.
HLS
-i
에 대한 설정 파일이 없기 때문에 표시되는 정보입니다.손으로 쓸 수 있지만 자동으로 생성되는 도구가 있으니 사용하세요.
설치하다.
이것도 사용자의 홈 디렉터리에 설치해 주세요.
cd ~
cabal install implicit-hie
hie.생성
cabal 파일이 있는 디렉터리에서 다음 동작을 실행하십시오.
gen-hie > hie.yaml
이후 다음 파일이 생성됩니다.hie.yaml
cradle:
cabal:
- path: "src"
component: "lib:start-haskell"
- path: "app/Main.hs"
component: "start-haskell:exe:start-haskell"
- path: "test"
component: "start-haskell:test:start-haskell-test"
이거 제출해 드릴게요.Warning 설정
아이고, 워닝 설정을 깜빡했네.
start-haskell.cabal
@@ -26,6 +26,7 @@ extra-source-files:
common shared-properties
build-depends: base ^>=4.13.0.0
default-language: Haskell2010
+ ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates -Wmissing-import-lists -Wcompat
common test-depends
build-depends: hspec ^>=2.7.4
아래 내용을 참고하여 추가hie.yaml
하였습니다.(또 다른 추천이 있으면 메시지를 남겨주세요.)
총결산
위에서 말한 바와 같이 설정량은 많지만 사전에 다양한 설정을 해 두면 개발에 진전이 있을 것이다.
이번 설정은 다음과 같은 창고로 요약된다.참고해주세요.
참고 문헌
Reference
이 문제에 관하여(Haskell 프로젝트 제작 방법(기본) 2021년판 추천), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/autotaker/articles/haskell-setup-2021텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)