2014-02-27 6 views
58

소스 폴더를 인식하지 못하는 내가 다른 빌드 타입을 만든 :안드로이드 스튜디오 내가 표준 안드로이드 스튜디오 디렉토리 구조를 사용하고

buildTypes { 
    debug { 
     runProguard false 
     packageNameSuffix ".debug" 
     signingConfig signingConfigs.debug 
    } 
    preview.initWith(buildTypes.debug) 
    preview { 
     packageNameSuffix ".preview" 
    } 
    release { 
     runProguard false 
     signingConfig signingConfigs.release 
    } 
} 

모든 것이 잘 컴파일하지만 AS는 소스 폴더의 모든 인식 나던. maindebug에서 폴더 만 내가 .iml 파일 sourceFolder을 확인

enter image description here

해당 폴더에서 확인 오류가없는 previewrelease에서 폴더가 실제로 일반 폴더 로 표시됩니다, 소스로 표시됩니다 태그가 추가되지 않았습니다. 내가 수동으로 줄을 추가 프로젝트 IML 파일을 편집하는 경우

는 :

<sourceFolder url="file://$MODULE_DIR$/src/preview/java" isTestSource="false" /> 
<sourceFolder url="file://$MODULE_DIR$/src/preview/res" type="java-resource" /> 

잘 작동하는 것 같다.

enter image description here

... 내 Gradle을 파일과 동기화 할 때까지 - 위의 라인을 제거합니다.

gradle 플러그인의 버그입니까? 아니면 잘못된 것입니까?

+1

Gradle에서 생성 된 * .iml 파일을 절대 편집해서는 안되기를 바랍니다. 프로젝트가 명령 줄에서 올바르게 빌드됩니까? 그렇지 않으면 가져 오기가 실패하고 프로젝트 모델이 업데이트되지 않습니다. 실제로 'initWith'라인이 필요한지 확실하지 않습니다. – botteaap

+0

방금 ​​iml 파일을 편집하여 이것이 이유인지 확인했습니다. 그래서 내 결론은 제대로 생성되지 않는다는 것입니다. – imbryk

+0

이 프로젝트는 명령 줄에서와 스튜디오에서 모두 컴파일 - 실제로 – imbryk

답변

112

빌드 변형 목록에서 전환해야합니다. 그러면 AS가 해당 원본 세트를 선택합니다. build variants

+11

아직도 나는 다른 변종에 대한 소스를 볼 수있게되기를 바란다. - 나는 조금 다른 성질의 변화를 수동으로해야한다. – imbryk

+2

합의, 모든 빌드 변형을 인식해야한다. 그리고 즉시 표시되므로 매우 혼란 스럽습니다! – Blacklight

+1

이 모든 작업을 마친 후에도 작동하지 않았습니다. 나는 2 개의 커스텀 풍미에 포함 된 일반적인 src 패키지에서 클래스를 가져 오는 데 문제가있다. 프로젝트가 Android Studio 편집기에서 성공적으로 컴파일되어 가져 오기 문제로 인해 오류가 표시됩니다. –

3

먼저 프로젝트를 다시 가져 오십시오. 모든 빌드 디렉토리, .iml 파일 및 .idea 폴더를 삭제하십시오. 그런 다음 프로젝트를 가져옵니다.

그래도 작동하지 않으면 "강제로"시도해보십시오. 이 이상적으로 해킹하고 있음을 Checkout this response from Bernd Bergler.참고 여기에 자신의 코드를 약간 수정 된 버전의

필요가 없습니다.

task addPreview { 
    def src = ['src/preview/java'] 
    def file = file("app.iml") 

    doLast { 
     try { 
      def parsedXml = (new XmlParser()).parse(file) 
      def node = parsedXml.component[1].content[0] 
      src.each { 
       def path = 'file://$MODULE_DIR$/' + "${it}" 
       def set = node.find { [email protected] == path } 
       if (set == null) { 
        new Node(node, 'sourceFolder', ['url': 'file://$MODULE_DIR$/' + "${it}", 'isTestSource': "false"]) 
        def writer = new StringWriter() 
        new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml) 
        file.text = writer.toString() 
       } 
      } 
     } catch (FileNotFoundException e) { 
      // nop, iml not found 
     } 
    } 
} 

// always do the addPreview on prebuild 
gradle.projectsEvaluated { 
    preBuild.dependsOn(addPreview) 
} 

는 단순히 android 섹션 외부에서 build.gradle 파일이 드롭합니다. Description from this source :

안드로이드 스튜디오가 자동으로 Gradle을 빌드 파일에서 프로젝트 파일을 .iml 생성합니다. 이 작업은 Android Studio 프로젝트 파일 app.iml 을 편집하고 테스트 디렉토리를 추가합니다. 안드로이드 Studio가 gradle 파일을 재검색 할 때마다 변경 사항이 사라지지만 그 직후에 빌드 이 실행되고 작업이 그것에 연결되므로 언제나 변경 사항이 적용됩니다. 이 버전은 보통 빌드 에 조금 다른 방식으로 새 작업을 추가하고 .iml 파일이 없으면 정상적으로 처리하는 등 비틀기를 번 수행합니다.

IDE는 현재 src 트리로 인식하지만 다른 src 트리와 연결하기를 원하지 않습니다.

+0

... 기본적으로 심한 해킹 인 * .iml 파일을 해킹하기 시작합니다. – botteaap

+1

당신과 동의하지 않습니다. – Sababado

+0

위대한 :) 이제 우리의 손가락을 십자가로 받아들이거나 upvoted되지 않습니다. – botteaap

1

모듈 빌드에 추가하십시오.Gradle을 파일 :이 시도 -

내 경우
sourceSets { 
    main.java.srcDirs += 'src/preview/java' 
    main.java.srcDirs += 'src/release/java' 
} 
+1

저는 이것을 시도했습니다. source.set 그룹을 내 build.gradle 파일의 "android"그룹 아래에 추가하면 소스 트리에 둘 다 추가됩니다. 그러나, 내 프로젝트 Foo.java 모두 맛을 구축, 그래서이 마술 궁극적으로 작동하지 않았다 컴파일러는 같은 이름 가진 두 개의 소스 파일에 대한 불평하기 때문에. – gjgjgj

2

파일 - 솔루션은 위의 당신을 위해 작동하지 않는, 그래서 만약> 무효화 캐시/다시 시작는 저를 도왔다.

관련 문제