cabal 또는 ghc를 설치하지 않고 하스켈 실행 파일 (cabal 프로젝트)을 실행하는 방법
나는 cabal과 함께 haskell에서 응용 프로그램을 만들었습니다. 명령 프롬프트에 "cabal run [cabal file]"을 입력하여 실행 파일을 실행할 수 있습니다. 이제이 응용 프로그램을 친구들과 공유하고 싶습니다. 가급적이면 컴퓨터에 cabal을 설치할 필요가 없습니다. 빌드 디렉터리에서 프로젝트의 .exe 파일을 찾을 수 있지만 프로그램과 함께 제공되는 .txt 파일은로드되지 않습니다. .exe 파일은 또한 cabal로 실행할 때 수행하지 않는 런타임에 터미널을 엽니 다 (해야하는 것처럼). 그것은 물건이 없어서 .exe를 단독으로 공유 할 수 없다는 것을 말해줍니다. cabal 또는 ghc를 설치하지 않고 내 애플리케이션을 실행하는 솔루션은 무엇입니까?
답변
여기에 몇 가지 가능한 해결책이 있습니다.
기본적으로 상대 경로를 사용하여 프로그램에서 파일을 열면 실행 파일이있는 위치가 아니라 실행 파일이 .NET에서 실행 된 위치 인 프로그램 의 현재 작업 디렉토리 에 상대적 입니다 . 실행 경로 또는 설치 디렉토리에 상대적인 파일을 찾으려면 명시 적으로 수행해야합니다. 이를 수행하는 두 가지 기본 방법이 있습니다. 수동으로 System.Environment.getExecutablePath
프로그램 디렉토리를 가져오고이를 파일 경로와 결합하는 것입니다.
import System.Environment (getExecutablePath)
import System.FilePath ((</>))
installRelative :: FilePath -> IO FilePath
installRelative relative = do
absolute <- getExecutablePath
pure (absolute </> relative)
readInstalledFile :: FilePath -> IO String
readInstalledFile path = readFile =<< installRelative path
data-files
Cabal 파일 의 필드를 사용 하여 프로젝트에 파일을 추가 할 수도 있습니다 . 이렇게하면 위에서 정의한 작업 과 동일한 기능을 수행 하는 몇 가지 기능을 내보내는 모듈 이 생성됩니다 . 그런 다음을 사용하여 프로젝트를 설치 하면 데이터 파일이 설치 디렉토리에 복사되고 프로그램이 런타임에 해당 파일을 찾을 수 있습니다. 그러나 이것은 Cabal을 사용하여 프로그램을 설치하는 것에 달려 있습니다. 설치 디렉토리가 구워진 절대 경로를 생성하기 때문 입니다.Paths_projectName
getDataFileName :: FilePath -> IO FilePath
installRelative
cabal install
cabal install
"프로그램 파일"디렉토리와 같은 컴퓨터의 표준 위치에 프로그램을 설치하는 데 사용 하는 경우 경로가 하드 코딩 되어도 상관 없으며 실행 파일과 지원 파일을 아카이브에 복사하고 사용자가 프로그램 파일 디렉토리에서 압축을 풀도록합니다.
ZIP 아카이브 대신 Windows 설치 프로그램을 빌드 할 수 있습니다 . 또는 file-embed패키지를 사용하여 직접 실행 파일에 파일을 포함하여 런타임에 어떤 것도로드하지 않아도됩니다 .
터미널이 열리는 것을 방지하는 방법 은 이에 대한 귀하의 질문에 대한 제 답변을 참조하십시오 .