代码之家  ›  专栏  ›  技术社区  ›  Coderino Javarino

需要一个模块,其路径来自项目根目录?

  •  0
  • Coderino Javarino  · 技术社区  · 7 年前

    我在做一个网络应用程序。考虑这样的结构

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

    BarChart.rkt 模块需要 Barchart.svg 模板,不使用任何 .. cd ProjectName; racket racket/Servlet.rkt ),需要的部分类似于 (require "template/barchart.svg")

    0 回复  |  直到 7 年前
        1
  •  3
  •   Zoé Martin    7 年前

    1) 天真的方法

    你可以用 (define-runtime-path) :

    #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
    

    正在注册您的包

    根据我的经验,开发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

    项目名称/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))