2016-08-10 3 views
2

서브 디렉토리 공개를 보유한 자원 디렉토리를 사용하는 부트 프로젝트를 설정하려고합니다. 나중에 모든 웹 관련 콘텐츠, 컴파일 된 클로저 스크립트 등을 포함해야합니다.boot-clj 프로젝트의 resources/public 디렉토리 사용

공개적으로 노출되지 않도록 리소스를 보유하려는 경우에 적합합니다.

추가 공용 디렉토리없이 그렇게하면 완벽하게 작동합니다. 추가 하위 디렉토리를 사용하려고하면 오류가 발생합니다.

{:require [{{name}}.core] 
:compiler-options {:asset-path "js/main.out"}} 
: main.cljs.edn이 보이는 반면

bash-4.3$ tree 
└── public 
    ├── index.html 
    └── js 
     └── main.cljs.edn 

다음 build.boot에서

: 자원 디렉토리 내에서

(set-env! :resource-paths #{"resources"} ...) 

... 

(deftask dev 
    [] 
    (comp 
    (serve 
    :handler 'myapp.server/handler 
    :reload true 
    :port 3000) 
    (watch) 
    (reload) 
    (cljs-repl) 
    (cljs) 
    (target :dir #{"resources/public"}))) 

여기에 관련된 구성입니다

boot dev을 호출하면 다음과 같은 현상이 발생합니다. ClojureScript는 계속 위트를 컴파일합니다 h 오류가 발생하여 프로세스가 수동으로 종료됩니다. 상대 경로와 관련된 재귀 오류처럼 보입니다.

Compiling ClojureScript... 
• public/js/main.js 
Writing target dir(s)... 
java.util.concurrent.ExecutionException: java.nio.file.NoSuchFileException: resources/public/public/public/js/main.out/goog/deps.js 

public/public/public/..이 길어질수록 계속 확장됩니다.

어디에서이 문제를 해결할 수 있을까요?

은 자원 폴더의 구조를 고려하십시오 :

bash-4.3$ tree 
└── private_file.txt 
└── public 
    ├── index.html 
    └── js 
     └── main.cljs.edn 

을 그리고 build.boot에서 다음과 같은 부분


업데이트 여기

질문의 업데이트 버전입니다 :

(set-env! :resource-paths #{"resources"} ...) 

    (deftask dev 
     [] 
     (comp 
     (serve 
     :handler 'myapp.server/handler 
     :reload true 
     :port 3000) 
     (watch) 
     (reload) 
     (cljs-repl) 
     (cljs) 
     (target))) 

'myapp.server/handler는 리소스/public (wrap-resource 또는 해당하는 resources에 의해 구현 됨)의 파일 만 제공한다는 것을 알고 있습니다. 나중에 심지어는 "비공개"로 기본 설정됩니다.

boot dev을 실행하면 전체 리소스 디렉토리가 물론 private_file.txt을 포함하여 대상 디렉토리에서 재생됩니다. (이 의도 된 행동입니까?, 나는 파일이 상당히 클 수 있고 디스크 공간의 두 배를 소모 할 수 있음을 의미합니다)

이 시점에서 나는 main : inside의 asset-path가 어떻게 영향을 미치는지 모르겠습니다. 여기의 예제에서 나는 "js/main.out"에 그것을 유지했다. 이것은 틀릴 수도있다.

답변

1

나는 당신의 생성 된 코드를 소스 디렉토리에 넣고 생성하는 파일을 소비하기 시작할 때 빌드 작업이 혼동을 야기 할 수 있다고 생각한다.범인은 다음과 같습니다

(target :dir #{"target"}) 

당신이 serve 작업을 사용하는 것처럼 자신의 반지 핸들러를 제공하여 단지

(target) 

하는 것과 같습니다

(target :dir #{"resources/public"}) 

나는 기본적으로 떠날 것이다 ('myapp.server/handler) 클래스 경로 ("public")에 올바른 루트 디렉토리를 지정하여 처리기가 클래스 경로의 자원을 제공하는지 확인해야합니다. 아마 당신은 이미 그런 ring.middleware.resource/wrap-resource을 사용하고 있습니다 :

(wrap-resource handler "public") 

마지막 것은 당신의 main.cljs.edn 파일입니다. 이 파일의 :asset-path should be set to js as it should be the relative path to JS files served by your server/handler (target/public/js의 파일은 http://localhost:xxxx/js입니다). 브라우저에서 사용할 수 있어야 target/publiccljs 같은 작업에 의해 생성이 설정 소스 파일 (resources/public에서 HTML, CSS 및 기타 파일)뿐만 아니라 파일

.

+0

문제는 여전히 boot-cljs가 resources 디렉토리에서 대상 디렉토리로 모든 것을 전송한다는 것을 의미합니다 (끝에 동일한 이름의 작업을 사용할 때). –

+0

이제 작동합니다. 혼란을 가져 주어서 죄송합니다. 이러한 것들은 까다 롭습니다. 자산 경로가'js' 또는'js/main.out'으로 설정 되더라도 상관 없습니다. –

+0

지금은 해결 된 것 같습니다. –