Как импортировать текстовый файл в проект Cabal? - PullRequest
0 голосов
/ 24 ноября 2018

В app / Main.hs я хочу открыть текстовый файл "foo.txt".Я знаю, как открыть текстовый файл в простой программе на Haskell.В моем кабальном проекте

import System.IO

Main = do
    contents <- readFile "foo.txt"
    print $ Main.lex contents
    return contents


type Keyword = String
lex :: String -> [Keyword]
lex "" = []
lex x = words x

выдает ошибку

openFile: не существует (нет такого файла или каталога)

Что мне делатьНужно изменить в моем файле cabal, или путь к файлу или местоположение, чтобы иметь возможность открыть файл?Я попытался поместить его рядом с выходным двоичным файлом, и это тоже не работает.

Это мой файл кабала:

-- This file has been generated from package.yaml by hpack version 0.28.2.
--
-- see: https://github.com/sol/hpack
--
-- hash: baf2fc7e230f4b4937dfd918a13fefb55b66c7a4468b24d0e3e90cad675b26d5

name:           CCompiler
version:        0.1.0.0
description:    Please see the README on GitHub at <https://github.com/githubuser/CCompiler#readme>
homepage:       https://github.com/githubuser/CCompiler#readme
bug-reports:    https://github.com/githubuser/CCompiler/issues
author:         Author name here
maintainer:     example@example.com
copyright:      2018 Author name here
license:        BSD3
license-file:   LICENSE
build-type:     Simple
cabal-version:  >= 1.10
extra-source-files:
    ChangeLog.md
    README.md

source-repository head
  type: git
  location: https://github.com/githubuser/CCompiler

library
  exposed-modules:
      Lib
  other-modules:
      Paths_CCompiler
  hs-source-dirs:
      src
  build-depends:
      base >=4.7 && <5
  default-language: Haskell2010

executable CCompiler-exe
  main-is: Main.hs
  other-modules:
      Paths_CCompiler
  hs-source-dirs:
      app
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      CCompiler
    , base >=4.7 && <5
  default-language: Haskell2010

test-suite CCompiler-test
  type: exitcode-stdio-1.0
  main-is: Spec.hs
  other-modules:
      Paths_CCompiler
  hs-source-dirs:
      test
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      CCompiler
    , base >=4.7 && <5
  default-language: Haskell2010

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Я понимаю, что ваш вопрос касается поиска файлов во время выполнения, которые вы хотите обработать и которые не упакованы вместе с вашим пакетом.

Где несколько способов, как вы можете найти файлы во время выполнения, которые не't packaged.

Либо добавьте флаг командной строки и вызовите свой исполняемый файл с абсолютным путем к файлу, который вы хотите обработать.

Или внедрите диалоговое окно выбора файла, например, gi-gtk.

Или жесткое кодирование относительных путей, что нежелательно, так как они интерпретируются относительно текущего рабочего каталога вашего процесса, которые могут различаться в зависимости от того, как программа начала работу.

Если вы хотите определить, в каком текущем рабочем каталоге работает ваша программа, если она запущена с cabal run, просто выполните небольшой тестовый проект со следующим кабальным файлом:

name: test2
build-type: Simple
cabal-version: >= 1.10
version: 0.0.0.1

executable test2
  hs-source-dirs: .
  main-is: test2.hs
  build-depends:
      base
    , directory

и следующим test2.hs:

module Main where

import System.Directory

main :: IO ()
main = do
  cwd <- getCurrentDirectory
  putStrLn cwd
0 голосов
/ 24 ноября 2018

добавьте

data-dir: data

в верхнюю часть файла cabal.

создайте каталог 'data' рядом с src и app и поместите туда все файлы.

Убедитесь, что у вашего cabal-файла также есть эта строка

other-modules:
  Paths_CCompiler

с именем вашего проекта вместо CCompiler.

Моя основная функция теперь это

module Main where

import Lib
import System.IO
import Paths_CCompiler

main = do
    filepath <- getDataFileName "return_2.c"
    contents <- readFile filepath
    print $ Lib.lex contents
    return contents

Благодаря этому сообщению в блоге .

...