2014-09-26 6 views
1

내가 시도하고 간단하게 (경로의 중간에) 디렉토리의 이름을 변경 개미 파일 세트/regexpmapper와 함께 연주 벽돌 벽에 내 머리를 두드리는거야 발행 간단한 :개미 regexpmapper 파일 분리는</p>는 <p>상황은 정말 ...

  • 내가 DB/api/src/main/distribution/component에 복사하고있어 경로 component/DB/ 있습니다.
  • 경로 구성 요소/DB에는 install.sql 스크립트 세트와 api (또는 "API"또는 "Api")이라는 디렉토리가 있습니다. 이 "api"디렉토리에는 추가 SQL이 포함되어 있으며 DB/api/component 대상에 도매로 복사됩니다 (따라서 DB/api/src/main/distribution/component/api 만들기).
  • 이 사본의 일부로 일관성을 위해 단순히 "api"디렉토리 이름을 소문자로 지정하고 싶습니다.

소리가 간단하고 파일 세트를 사용하여이 작업을 수행하고 regexpmapper (또는 mapper type=regexp)을 수행했습니다. 그러나, 나는 결과가 엇갈 렸습니다 ... 특히 '/'를 (또는 '\\'또는 '/'또는 ${file.separator}, 심지어 regexpmapper.handledirsep=yes을 사용하는 경우에도) 입력하는 즉시 작동하지 않습니다. (find에서)

여기 난독 소스 경로 구조 :

component/DB/ 
component/DB/API 
component/DB/API/file1.sql 
component/DB/API/file2.sql 
component/DB/xyz.sql 
component/DB/Install_API.sql 
component/DB/excludes1/... 

내 기본 사본은 다음과 같습니다 : 나는 선명도에 '/'일반 왼쪽했습니다

<copy todir="${my.db.api.dir}/src/main/distribution/component" verbose="true"> 
    <fileset dir="${component.src.dir}/DB"> 
     <exclude name="exclude1"/> 
     <exclude name="exclude1/**/*"/> 
    </fileset> 
    <regexpmapper handledirsep="yes" 
      from="(.*)/API(.*)" to="\1/api\2"/> 
    <!--mapper type="regexp" from="(.*)/API(.*)" to="\1/api\2"/--> 
</copy> 

. 기본 전제는 "API"를 발견하고 주변 텍스트를 잡고 대신 "api"로 재생하는 것입니다. from에서 '/'를 생략하면 실제로 작동하지만 '/'(또는 친구)를 입력하자마자 디렉토리가 전혀 복사되지 않습니다. 내가 그 dir의 이름 만 바꾸고 그 안에 포함 된 Install_API.sql 파일이 아니라 앞의 '/'를 원한다는 것에주의하십시오.

온라인에서 많은 예제가 있지만 실제로는 작동중인 예제가 모두 '/', '\'또는 'handledirset'속성에 의해 처리되도록 주장하는 것으로 보이는 것처럼 아무도이 문제가 없었던 것으로 보입니다.

개미 1.8.4 on RH6.3

많은 감사합니다.

답변

1

귀하의 파일 세트의 기본 디렉토리는 매퍼가 매핑 될 경로의 형식은 해당 디렉토리

API/file1.sql 
Install_API.sql 
excludes1/... 

상대적 것을 의미 DB 디렉토리입니다. 따라서 API 디렉토리 이름 앞에 슬래시가없고 from 패턴이 일치하지 않습니다. 하지만 더 깊은 문제가 있습니다. 정규 표현식은 from 패턴과 일치하지 않는 파일 이름을 완전히 무시합니다. APIapi으로 변경해야하지만 비 API 파일 이름은 변경하지 않아야하므로 원하는 결과가 아닙니다. 그래서 오히려 regexpmapper보다 당신이 replaceregex 필터와 filtermapper이 필요합니다

환상적인 덕분에 나는 놓쳤다 잘 넣어 교훈을의
<copy todir="${my.db.api.dir}/src/main/distribution/component" verbose="true"> 
    <fileset dir="${component.src.dir}/DB"> 
     <exclude name="exclude1"/> 
     <exclude name="exclude1/**/*"/> 
    </fileset> 
    <filtermapper> 
     <!-- look for either just "API" with no trailer, or API followed by 
      a slash, in any combination of case --> 
     <replaceregex pattern="^API(?=${file.separator}|$$)" replace="api" 
         flags="i"/><!-- case-insensitive search, finds API, Api, ... --> 
    </filtermapper> 
</copy> 
+0

. 괜찮 으면 한 가지 후속 질문이 있습니다.내 출력물에서는'/ src/main/distribution/component \ api' (내가 원함)뿐만 아니라'/ src/main/distribution/component/API' (자세한 내용은 "[copy] API "존재하지 않는 API로 추가되었습니다."및 "1 개의 빈 디렉토리를 ... 구성 요소 아래의 1 개의 비어있는 디렉토리에 복사했습니다."나중에 삭제할 수 있지만 설정 문제 (mo에서 읽음)가 있는지 궁금합니다. – wmorrison365

+0

@ wmorrison365 그 이상한데, 나는'파일 세트'가 그것의 엔트리 중 하나 인'API' 디렉토리를 포함하지 않고 _files_ 세트라고 생각했다. (그리고 나는 대소 문자를 구별하지 않는 FS로 테스트했다. 처음에는 이것을 발견하지 못했습니다.) 정규식을 약간 변경하여 API와 "API/무언가"가 일치하도록했습니다. –

+0

다시 한번 감사드립니다. @ianroberts. 파일 sep를 포함하지 말고 귀하의 설명을 주어^사용하십시오. 나는 당신의 개선을 시도해 볼게. 많이 감사하겠습니다. – wmorrison365