Haskell 프로젝트 제작 방법(기본) 2021년판 추천

21076 단어 Haskellcabalsetuptech

개시하다


(조금만 더) 새해를 축하합니다.
이 글은 내가 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
두 번째 명령을 실행하면 서로 항목을 설정할 수 있습니다.
몇 가지 요점을 파악하면
  • 첫 번째 질문예 n
  • package type: Library and Executable
  • cabal spec: 2.4
  • Application source directory: app
  • Library source directory: src
  • Test source directory: test
  • 이렇게 하자.그 외에 기본값을 먼저 설정하면 문제없다.
    다음은 설정 예입니다.
    $ 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.
    https://github.com/autotaker/start-haskell/commit/611ed45ea7c023447f2ac0c522e9f5d028fab555

    작업 설정


    구축 또는 테스트를 작업으로 추가합니다.
    명령 트레이에서 Tasks: Configure Task를 선택하면 tasks.json가 생성됩니다.cabal build, 등록cabal test.
    https://github.com/autotaker/start-haskell/commit/aa542fab4f358309644448b759016e9cadcb6736
    이렇게 되면 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
    
    예시를 작성하여 아래 제출을 확인하세요.
    https://github.com/autotaker/start-haskell/commit/224e8bf0052414acb473bfa498a40206d5c4d1c5
    자세한 내용은 여기.를 참조하십시오.

    hspec-discover

    import: ${セクション名}Haskell 단원 테스트의 공장 표준이다.hspec 도구를 사용하면 테스트 디렉터리 이하의
    일치하는 모듈hspec-discover을 검색하고 각 모듈*Spec.hs을 실행합니다.
    설정 예시는 아래 제출을 참고하십시오.
    https://github.com/autotaker/start-haskell/commit/c81d5aa8fcfe7f144b771d4d6b0a65bfa6f1c97e

    cabal-fmt


    cabal 파일에서 specexposed-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
    
    설정 예시는 아래 제출을 참고하십시오.
    https://github.com/autotaker/start-haskell/commit/2b04f8482f895fdf4ef1a00862acbec66c97650b

    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하였습니다.
    (또 다른 추천이 있으면 메시지를 남겨주세요.)
    https://functor.tokyo/blog/2017-07-28-ghc-warnings-you-should-enable

    총결산


    위에서 말한 바와 같이 설정량은 많지만 사전에 다양한 설정을 해 두면 개발에 진전이 있을 것이다.
    이번 설정은 다음과 같은 창고로 요약된다.참고해주세요.
    https://github.com/autotaker/start-haskell

    참고 문헌


    https://haskell.e-bigmoon.com/posts/2019/10-07-cabal-fmt.html
    https://github.com/mpickering/hie-bios#explicit-configuration
    https://haskell.e-bigmoon.com/posts/2020/01-18-cabal-build-tool-depends.html

    좋은 웹페이지 즐겨찾기