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))