ํ์ค์ผ ๊ฐ๋ฐํ๊ฒฝ (stack + IntelliJ plugin)
by JiwonDev#1. ํ์ค์ผ ์ปดํ์ผ๋ฌ
๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ํ์ค์ผ ์ปดํ์ผ๋ฌ๋ GHC(glasgow haskell compiler)์ด๋ฉฐ
์ฝ์์ฐฝ์์ ์ฌ์ฉ ์ GHCI (GHC ์ธํฐํ๋ฆฌํฐ)๋ฅผ ์ด์ฉํด์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฐ๋ฆฌ๋ Stack์ ์ด์ฉํด์ ์ค์น ํ ๊ฑฐ๋ผ ์ฝ์์ฐฝ์ ์ฌ์ฉํ ๋๋ ์๋์ ๊ฐ์ด ์คํ์ํค๋ฉด ๋ฉ๋๋ค.
>> stack ghci
#2. Stack (ํ์ค์ผ ํ๋ก์ ํธ ๊ด๋ฆฌ๋๊ตฌ)
2015๋ ์ ๋์จ ํ์ค์ผ ํ๋ก์ ํธ ๊ด๋ฆฌ๋๊ตฌ์ ๋๋ค.
ํ์ค์ผ๋ ๋ค๋ฅธ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ธฐ์กด์๋ ๋ณต์กํ ํ๋ก์ ํธ์ ์์กด์ฑ ๊ด๋ฆฌ (๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฒ์ ์ด ๊ผฌ์ด๋ ๊ฒ)๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด์๋๋ฐ stack์ด ๋์ค๊ฒ ๋๋ฉฐ ๊ทธ ์ญํ ์ ๋์ ํ๊ฒ ๋์์ต๋๋ค.
์ฐธ๊ณ ๋ก stack์ ์ค์นํ๋ฉด GHC(ํ์ค์ผ ์ปดํ์ผ๋ฌ)๋ ํจ๊ป ์ค์น๋ฉ๋๋ค.
* [๋๋ณด๊ธฐ] ๊ทธ๋ผ ๊ธฐ์กด์๋ ๋ฌด์์ ์ฌ์ฉํ๋์?
1. ๊ธฐ์กด์๋ Cabel์ด๋ผ๋ ํ๋ก์ ํธ ๊ด๋ฆฌ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
2. ๊ธฐ์กด์๋ ํ์ค์ผ ํํ์ด์ง์ ๋ค์ด๊ฐ์ Haskell Platform ( GHC + Cabal ๋น๋ ๋๊ตฌ + ๋ง์ด ์ฌ์ฉํ๋ ํจํค์ง)๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ํ๋์ ํ์ค์ผ ํ๋ก์ ํธ๋ ๋๋ถ๋ถ stack์ ์ฌ์ฉํ๋ฏ๋ก, ์ฐ๋ฆฌ๋ stack์ ์ฌ์ฉํ๋๋ก ํฉ์๋ค.
3. ํ์ค์ผ์ ํ์ค ํจํค์ง ์ ์ฅ์๋ Hackage, ์คํ์์ ์ฐ์ด๋ ํจํค์ง ์ ์ฅ์๋ Stackage ๋ผ ๋ถ๋ฆ ๋๋ค.
Stackage์์๋ ์ด๋ ํ ์กฐํฉ์ผ๋ก๋ ํจํค์ง ์์กด์ฑ์ด ๊ผฌ์ด์ง ์๋๋ก ๋ชจ์๋ ํจํค์ง๋ฅผ ์ ๊ณตํด์ค๋๋ค.
์ฌ๊ธฐ์ ์๋, ์ฆ stack.yaml์ ์ง์ํ์ง ์๋ ์ค๋๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด ์๋ ์ ์ฐ๋ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ(Cabel)๋ฅผ ์ฌ์ฉํด์ ์ค์นํ๋ฉด ๋ฉ๋๋ค.
4. Stack์ ๋ํด ๋ ๊ถ๊ธํ๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
#3. ๊ฐ๋ฐํ๊ฒฝ
๊ฐ๋ฐ ํ๊ฒฝ์ ๋ณธ์ธ์ด ์ฐ๊ธฐ ํธํ ๊ฑธ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
๋ณดํต ํธ์ง๊ธฐ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ฝ๊ฒ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋๋ฐ, ์์ผ๋ฉด ์ฝ์์ฐฝ ์ด๊ณ stack ์ผ๋ก ์ง์ ์คํ์์ผ๋ ๋ฉ๋๋ค.
์ด ๊ธ์์๋ IntelliJ + IntelliJ ํ์ค์ผ ํ๋ฌ๊ทธ์ธ ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ๋ก Vscode๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ณดํต haskero ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํฉ๋๋ค.
(2020) ์ด๋ค IDE๊ฐ ํ์ค์ผ ๊ฐ๋ฐ์ ์ต๊ณ ์ผ๊น์?
* [๋๋ณด๊ธฐ] IntelliJ ํ์ค์ผ ํ๋ฌ๊ทธ์ธ
github.com/rikvdkleij/intellij-haskell/blob/master/README.md
- Syntax highlighting;
- Error/warning highlighting;
- Haskell Problems View. This tool window displays GHC messages for the currently edited files;
- Find usages of identifiers;
- Resolve references to identifiers;
- Code completion;
- In-place rename identifiers;
- View type info from (selected) expression;
- View quick documentation;
- Structure view;
- Navigate to declaration or identifier powered by Hoogle (called Navigate>Navigation by Hoogle in IntelliJ menu);
- Inspection by HLint;
- Quick fixes for HLint suggestions;
- Show error action to view formatted messages. Useful in case message consists of multiple lines (Ctrl-F10, Meta-F10 on Mac OSX);
- Intention actions to add language extension (depends on compiler error), add top-level type signature (depends on compiler warning);
- Intention action to select which module to import if the identifier is not in scope;
- Default code formatting by ormolu. Alternatively by stylish-Haskell.
- Code completion for project module names, language extensions, and package names in Cabal file;
- Running REPL, tests, and executables via Run Configurations;
- Smart code completion on typed holes (since GHC 8.4);
# 3-1 IntelliJ ์ค์น
๋ฌด๋ฃ ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ ์ค์นํด๋ ์ข๊ณ , ๋ํ์์ด๋ผ๋ฉด ํ๊ต ๊ณ์ ์ ์ด์ฉํด ๋ฌด๋ฃ๋ก ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
www.jetbrains.com/idea/download/#section=windows
# 3-2 Stack ์ค์น
์คํ์ ์ค์นํ๊ณ ์ค์นํ ์คํ์ ์ด์ฉํด ํ์ํ ํจํค์ง๋ฅผ ๋ค์ด๋ฐ์ ์ค์๋ค.
์ฐธ๊ณ ๋ก stack์ ์ค์นํ๋ฉด GHC(ํ์ค์ผ ์ปดํ์ผ๋ฌ)๋ ํจ๊ป ์ค์น๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์๋์ฐ10์ ์ค์นํ ๊ฑฐ๋, ์๋ ๋งํฌ์์ Windows ํญ๋ชฉ์ ์ฐพ์ 64-bit installer๋ฅผ ๋ค์ด๋ก๋ ํด์ค์๋ค.
docs.haskellstack.org/en/stable/install_and_upgrade/
์ฐธ๊ณ ๋ก stack์ ๊ธฐ๋ณธ ์ค์น ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
>> C:\Users\[์ฌ์ฉ์ ์ด๋ฆ]\AppData\Roaming\local\bin\stack.exe
* ์๋ ๋๊ตฌ๋ค์ IntelliJ-Haskell์์ ์๋์ผ๋ก ์ค์นํด์ค๋๋ค. ์๋ ์ค์น๊ฐ ์๋์ ๋๋ง ํด์ฃผ์ธ์.
* ์ค์น์ฌ๋ถ๋ Ctrl+Shift+A -> About Haskell Project - Help ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
- stack ์ค์น๋ฅผ ์๋ฃํ๋ค๋ฉด, ์ฝ์์ฐฝ(์๋์ฐ+R -> cmd ์ ๋ ฅ)์ ์ด์ด ๊ฐ๋ฐ์ฉ ํจํค์ง๋ฅผ ์ถ๊ฐ๋ก ์ค์นํด์ค์๋ค.
- hindent (ํ์ค์ผ ์ฝ๋ ํํธ๋๊ตฌ) , stylish-haskell(์ฝ๋ ํฌ๋งทํ ๋๊ตฌ) , hlint (ํ์ค์ผ lint)
- ์ฐธ๊ณ ๋ก hoogle(ํ์ค์ผ docs)๋ ์๋์ผ๋ก ์ค์น๋ฉ๋๋ค.
>> stack install hindent stylish-haskell hlint
* [๋๋ณด๊ธฐ] ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์คํจ, ~name~:: invalid argument(invalid character)
์๋์ฐ์์ ๋ฐ์ํ๋ ๋ฌธ์์ด ๊ด๋ จ ์ค๋ฅ(UTF-8)์
๋๋ค.
ex ) commitAndReleaseBuffer: invalid argument (invalid character)
stack ์ค์น๊ฒฝ๋ก์ ํ๊ธ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ ์ฃผ์๊ณ
์ฝ์์ฐฝ์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ณ์ ๋ฌธ์์ด ์ธ์ฝ๋ฉ์ ๋ฐ๊พธ๊ณ ๋ค์ ์ค์นํด์ฃผ์ธ์.
chcp 65001
* [๋๋ณด๊ธฐ] ์ฝ์์ฐฝ์์ stack ์คํ์ด ์๋๋ค๋ฉด
์๋์ฐ ์ธ์คํจ๋ฌ๋ก ์ค์นํ๋ค๋ฉด ํ๊ฒฝ๋ณ์๊ฐ ์๋์ผ๋ก ์ค์ ๋์ด์์๊ฑด๋ฐ, stack.exe๋ฅผ ๋ชป์ฐพ๋๋ค๋ฉด ์ค์น๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ์ ์ง์ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค. ํ๊ฒฝ๋ณ์๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด์ ๋ค๋ฉด cd๋ก ์ง์ stack.exe ์์น๋ฅผ ์ฐพ์์ ์คํ์์ผ๋ ๋ฉ๋๋ค.
# 3-3 IntelliJ ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ค์
** ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ํ๊ธ์ด๋ ๋์์ฐ๊ธฐ๊ฐ ํฌํจ๋์ด์์ผ๋ฉด ๋น๋๊ฐ ์๋ฉ๋๋ค.
(~~library ์ด๋ฆ~~:: invalid argument (invalid character)), ์ค๋ฅ ์ค๋ช ๊ทธ๋๋ก, ์ด๋ ํ๋ฌ๊ทธ์ธ ์ค๋ฅ๊ฐ ์๋๋ผ Stack ์์ฒด ์ค๋ฅ์ ๋๋ค. ์ฝ์ ์ ์๋ ๊ธ์๊ฐ ์์ด ๋น๋์ ์คํจํ๋ค๋ ์๋ฏธ๋๊น ๋นํฉํ์ง๋ง๊ณ ํ๋ก์ ํธ ๊ฒฝ๋ก์ ๋์์ฐ๊ธฐ๋ ํ๊ธ ๊ฒฝ๋ก๋ฅผ ์์ ์ฃผ์ธ์
IntelliJ - Plugins ์ ๋ค์ด๊ฐ์ ์๋ 2๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ค์๋ค.
์ฐธ๊ณ ๋ก HaskForce๋ ํ์ค์ผ ๋น๋ ํ๋ฌ๊ทธ์ธ์ธ๋ฐ, ์ฐ๋ฆฌ๋ Intellij-Haskell์ ์ฌ์ฉํ ๊ฑฐ๋ผ ๊ฐ์ด ์ค์นํ๋ฉด ์๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ์์ฑ์ ๋๋ฅด๋ฉด SDK ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ค์นํ stack.exe์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
[๋๋ณด๊ธฐ] ํ๋ก์ ํธ ์์ฑ ์ค๋ฅ - ์ธํ ๋ฆฌ์ ์ด 2020 ์ต์ ๋ฒ์
( Error adding module to project couldn't create haskell module... )
์ธํ ๋ฆฌ์ ์ด ์ต์ ๋ฒ์ (2020)์์ ์ฃผ๋ก ๋ํ๋๋ ์ค๋ฅ์ ๋๋ค.
IntelliJ ์์ stack์ ์ด์ฉํ ๊ธฐ๋ณธ ํ๋ก์ ํธ ํด๋๊ตฌ์กฐ๋ฅผ ์์ฑํ์ง ๋ชปํด์ ๋์ค๋ ์ค๋ฅ์ ๋๋ค.
์ด๋ด๋๋ ํ๋ก์ ํธ๋ฅผ ์ธํ ๋ฆฌ์ ์ด์์ ์์ฑํ์ง๋ง๊ณ
์ฝ์์ฐฝ์ ์ด์ด stack์ผ๋ก ์ง์ ์์ฑํด์ฃผ๊ณ ์ง์ ํ๋ก์ ํธ๋ฅผ Open์ผ๋ก ์ด์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
>> stack new ํ๋ก์ ํธ์ด๋ฆ
์ผ๋ก ์ง์ ํ๋ก์ ํธ๋ฅผ ์์ฑ ํ ํ, ํด๋น ํ๋ก์ ํธ๋ฅผ IntelliJ - Open Project์ผ๋ก ์ด์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ทธ ๋ค์์ Project SDK๋ฅผ stack.exe๋ฅผ ์ฐพ์์ ์ ํํด์ฃผ๋ฉด ์ ์คํ๋ฉ๋๋ค.
์๋์ ๊ฐ์ด ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ฉด ์ฑ๊ณต. Main.hs (ํ์ค์ผ ํ์ผ์ ์ฒซ๊ธ์๋ ๋๋ฌธ์ ํ์)๋ app ํด๋์์ ์์ต๋๋ค.
ํ๋ก์ ํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋ค๋ฉด, ์ค์ ์ ๋ค์ด๊ฐ์ ์ปดํ์ผ ํ๊ฒฝ์ ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์๋์ ์ฝ๋๋ฅผ Main.hs์ ์์ฑํ๊ณ ์คํ์์ผ๋ด ์๋ค.
-- (์ด ๊ธฐํธ๋ ์ฃผ์์
๋๋ค.)
-- stack ghci ๋ก ์ฝ์์ฐฝ ์คํ๋ ๊ฐ๋ฅํด์.
-- :: stack ghci
-- :: main
import System.IO
main = putStrLn "Hello, World!"
[๋๋ณด๊ธฐ] Run์ด ์๋ํ์ง ์์.
์๋์ ๊ฐ์ด ์ง์ SDK๋ฅผ ์ค์ ํ๊ณ IntelliJ๋ฅผ ๊ป๋ค๊ฐ ์๋ก์ผ์ฃผ์.
์ฐธ๊ณ ๋ก ์คํ์ดํ์ ์๋์ผ๋ก ๊ฐ์ข ํ์ค์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ hoogle (Haskell API search engine) ์ด ์ค์น๋ ํ ๋ฐ, ์ด๊ฒ ์ฉ๋์ด ์ปค์ ์๊ฐ์ด ์ข ๊ฑธ๋ฆฐ๋ค.
๊ทธ๋ฅ IntelliJ๋ฅผ ์ผ๋๊ณ ๋ด์งํ์.
# 3-4 IntelliJ ์ฌ์ฉ์ ์ฃผ์์ฌํญ
์ฐธ๊ณ ๋ก ์ธํ ๋ฆฌ์ ์ด์์ ํ์ค์ผ์ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ค์ ์ด ๋ก๊ทธ๊ฐ ๋ณด์ด์ง ์๋๋ก ๋์ด์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ์ค์ผ ๊ฐ๋ฐ์ ํด์ผํ๋ฏ๋ก, File - Setting- ... ์ ๋ค์ด๊ฐ์ Haskell log๋ฅผ ๋ณด์ด๋๋ก ์ฒดํฌํด์ค์๋ค.
'๐ฑBackend > Haskell' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #3 (0) | 2021.04.20 |
---|---|
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #2 (0) | 2021.04.17 |
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #1 (0) | 2021.04.17 |
Haskell์ ํ๋ก์ ํธ ๊ตฌ์กฐ(stack project) (0) | 2021.03.25 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev