: 사용자 프로파일의 설정이 항목의 설정을 덮어씁니다.clj

4290 단어 leiningen

묘사

코드
(let [p (merge-profiles
         (with-meta {} {:without-profiles {:key "project.clj"}
                        :profiles {:user {:key "user"}}})
         [:user])]
  (pprint p)
  (println "---------------")
  (pprint (meta p)))
이것을 인쇄하려면 다음과 같이 하십시오.
{:key "user"}
---------------
{:excluded-profiles (),
 :included-profiles (:user),
 :active-profiles [:user],
 :profiles {:user {:key "user"}},
 :without-profiles {:key "project.clj"}}
그러나 사용자 프로필의 값이 :without-profiles 의 값을 덮어쓰는 것은 잘못된 것 같습니다.이게 벌레야?

토론 #1

변화가 테스트를 깨뜨렸기 때문에 나는 그것을 회복했다.profiles.clj의 기본값 덮어쓰기project.clj에 설정된 특정 값은 의미가 없기 때문에 이 문제를 조사해야 한다.

토론 #2

잘 모르겠어요.내가 보기에, 그것은 지금 예상대로 일하고 있다.병합:user 프로파일은 해당 프로파일의 값을 우선시해야 합니다.

토론 #셋

현재 프로젝트의 설정보다 우선순위가 높습니다.clj, 상식적 기대와 일반적인 관례를 반대합니다.기본 설정과 기본 설정에 현시적으로 적용되는 설정 파일 사이에는 차이가 있어야 합니다.나는 두 가지 건의가 있다.
1. :default 단면 벡터를 하나의 특례로 하고 이를 배경으로 하여 기타 모든 내용을 적용한다.
2. 프로필과 :without-profiles의 의미를 통일시켜 다른 프로필로 만든다. 이름은 :project이고 :default 벡터 중:active-profiles에 위치한다.
방법분명히 더 급진적이지만, 전체 코드가 줄어들고, 더욱 뚜렷하고 명확한 규칙이 생겨서 효과적인 프로젝트 맵을 내보낼 것이다.

토론 #4

이 문제를 더욱 실질적으로 하기 위해 우리는 시작할 때
(project/init-profiles [:default])
그 중에서 :default는 벡터[:base :system :user :provided :dev]로 해석되었다.나의 최초의 예는 merge-profiles와 관련이 있는데, 그것은 기본적으로 init-profilesset-profiles 위의 편의 함수이다.
이 문제는 반드시 상술한 어떤 기능과 관련이 있는 것이 아니라 project.clj의 설정을 사용자 등급과 시스템 등급의 기본값과 통합시키는 데 대한 보다 광범위한 의미이다. 현재 이러한 기본값은 일반적인 설정 파일로 적절하게 나타난다.
겸사겸사 한마디 merge-profiles 는 사실상 단어가 부적절한 단어로 activate-profiles 로 묘사하는 것이 가장 좋다.unmerge-profiles와 마찬가지로 실제로deactivate-profiles.

토론 #5

미안해요. 진정한 문제가 뭔지 모르겠어요.프로젝트보다 사용자 프로파일을 우선시킵니다.clj는 디자인을 거쳤습니다. 왜냐하면 때때로 당신이 종사하는 모든 프로젝트의 주어진 설정을 덮어쓰고 싶을 때가 있습니다.예를 들어 :eval-in :nrepl 또는 운영 체제별 일부 설정
나는 merge-profiles 더 좋은 이름을 사용할 수 있다는 것에 동의하지만, 우리는 지금 그것을 바꿀 수 없다.그렇게 지도 모른다, 아마, 아마...

토론 #6

네, 몰라요. 하지만 기본값을 설정하고 싶어요. 우선순위가 project.clj보다 낮아요.예를 들어 :repl-options {:port 4001}는 전역 기본값이 되지만 프로젝트가 특정 값을 사용하는 경우 이 값을 준수하십시오.:user 프로필 외에 시스템 범위 내의 기본 설정도 있기 때문에 최소한 이 설정들은 project.clj을 초과하지 않기를 바랍니다.

토론 #7

마스터의 현재 repl.clj 코드를 보면 같은 예상 행위의 증거를 볼 수 있습니다. 비록 그것이 잘못된 것일지라도:
(defn- repl-port [project]
  (Integer. (or (System/getenv "LEIN_REPL_PORT")
                (-> project :repl-options :port)
                (-> (user/profiles) :user :repl-options :port)
                0)))
(-> project :repl-options :port)에서 검색한 유효한 값이 :user 프로필 설정을 project.clj 프로필 설정에 적용했기 때문에 작업을 할 수 없습니다.

토론 #8

이 문제를 한층 더 생각하면 대부분의 경우project.cljprofiles.clj보다 전국적이고 통용성이 있다. 왜냐하면 이것은 모든 개발자가 공유하는 부품이기 때문이다.따라서 사용자 프로필 트럼프project.clj를 보유하는 것은 자연스럽다.그러나 이것은 내가 profiles.clj를 통해 설정한 모든 항목에 대한 설정을 설정할 방법이 없다는 것을 의미한다. 아니면 내가 이 방면에서 틀렸는가?
다른 점은 :replprofiles.clj 프로필의 우선순위가 :replproject.clj 프로필보다 낮기 때문에 우리는 상반된 행동을 얻었다.이것도 일부러 그런 거예요?

토론 #9

this also means that I have no means at all to configure a per-project setting for anything I have configured through profiles.clj


체크 인되지 않은 profiles.clj 파일을 프로젝트 루트 디렉토리에 넣을 수 있습니다.그러나 이 설정 파일을 자동으로 적용하려면 :dev 이 필요합니다. 이것은 :dev 에 숨겨져 있는 project.clj 을 의미합니다. 존재한다면.
대부분의 경우 :user와 함께 ^:displace 프로필에 넣으면 작용하지만 숫자와는 작용하지 않는다. 왜냐하면 메타데이터를 추가할 수 없기 때문이다.나는 우리가 3.0의 전체 개요 문서를 다시 써서 실현하지 않으면 이 문제를 해결할 수 있다고 생각하지 않는다.

좋은 웹페이지 즐겨찾기