我正在制作一个网络应用程序。考虑这样的结构
ProjectName/racket/Servlet.rkt
ProjectName/racket/chart/barchart/BarChart.rkt
ProjectName/template/barchart.svg
如何在 BarChart.rkt
模块内需要 Barchart.svg
模板,而不使用任何 ..
?理想情况下,如果应用程序从 ProjectName 启动(即 cd ProjectName;racketracket/Servlet.rkt
),则 require 部分将类似于 (require "template/barchart.svg")
,但使用 ProjectName 作为根,而不是相对的 ProjectName/racket/barchart。
最佳答案
1)朴素方法
您可以使用(定义运行时路径)
:
项目名称/chart/barchart/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))
项目名称/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 安装
。
然后您可以使用 在任何文件中 require BarChart.rkt(require ProjectName/chart/BarChart)
。
我为什么要告诉你这些?因为现在,您可以从任何文件夹启动应用程序:
racket -l 项目名称/Servlet
无论您在哪个目录中运行程序,这都可以让您轻松测试您的路径是否得到处理。
摆脱../..
现在您的包已在本地数据库中注册,您可以使用 pkg/lib
中的 (pkg-directory)
轻松找到它的根目录:
项目名称/chart/barchart/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))
关于racket - 需要使用项目根目录中的模块路径吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105211/