Требуется ли модуль, используя его путь от корня проекта? - PullRequest
2 голосов
/ 11 марта 2019

Я делаю веб-приложение.Рассмотрим такую ​​структуру

ProjectName/racket/Servlet.rkt
ProjectName/racket/chart/barchart/BarChart.rkt
ProjectName/template/barchart.svg

Как внутри модуля BarChart.rkt может потребоваться шаблон Barchart.svg без использования ..?В идеале, если приложение запускается из ProjectName (то есть cd ProjectName; racket racket/Servlet.rkt), обязательная часть будет выглядеть как (require "template/barchart.svg"), но вместо ProjectName / racket / barchart будет использоваться ProjectName в качестве корневого элемента.

1 Ответ

3 голосов
/ 15 марта 2019

1) Наивный метод

Вы можете использовать (define-runtime-path):

ProjectName / график / шкальный / BarChart.rkt:

#lang racket/base
(provide barchart-template)
(require
  racket/runtime-path
  racket/file)

(define-runtime-path barchart.svg "../../template/barchart.svg")

(define (barchart-template)
  (file->string barchart.svg))

ProjectName / Servlet.rkt:

#lang racket/base
(require ProjectName/chart/barchart/Barchart)

(displayln (barchart-template)) ;; prints the content of the SVG file, wherever you are

2) Лучший метод

Регистрация вашего пакета

Исходя из моего опыта, лучший способ обработки путей при разработке приложения Racket - создание пакета, а затем использование классического синтаксиса (require my-package/my-module) вместо использования относительных путей.

Например, если у вас есть такой проект:

ProjectName/Servlet.rkt
ProjectName/chart/barchart/BarChart.rkt
ProjectName/template/barchart.svg

Добавляя файл info.rkt в корень вашего проекта, вы превращаете его в пакет.

echo "#lang info" > ProjectName/info.rkt

Затем позвоните cd ProjectName; raco pkg install.

Тогда вам может потребоваться BarChart.rkt в любом файле с (require ProjectName/chart/BarChart).

Почему я тебе всё это рассказываю? Потому что теперь вы можете запустить приложение из любой папки:

racket -l ProjectName/Servlet

Это позволит вам легко проверить, обрабатываются ли ваши пути независимо от того, в каком каталоге вы запускаете программу.

Избавление от ../..

Теперь, когда ваш пакет зарегистрирован в локальной базе данных, вы можете легко найти его корневой каталог, используя (pkg-directory) из pkg/lib:

ProjectName / график / шкальный / BarChart.rkt:

#lang racket/base
(provide barchart-template)
(require
  racket/file
  pkg/lib)

(define (barchart-template)
  (define template.svg (build-path (pkg-directory "ProjectName")
                                   "template/barchart.svg"))
  (file->string template.svg))
...