2017-01-27 7 views
8

Я использую Android Studio с Google Диском, что делает видимыми скрытые системные файлы (например, Icon и desktop.ini), вызывая ошибки, как описано here. Вместо того чтобы запускать скрипты для удаления этих файлов, я хотел бы дать указание gradle 2.14 игнорировать их.Как исключить определенные файлы из Android Studio?

В попытке выяснить, как исключить файлы, я создал файлы с именем «excludeme.txt» в каталогах \app\src\main\res\values и в \app\src\main\java\com\hfad\stopwatch\. Я безуспешно пробовал различные модификации двух файлов build.gradle в моем проекте. Ни один из них не удалил файл.

В частности, я сделал следующее изменение в файл build.gradle для Module: app, за this question:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar'], excludes: ['**/excludeme.txt']) 
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    testCompile 'junit:junit:4.12' 
} 

Я также добавил это к android секции того же build.gradle файла, в this question:

aaptOptions { 
    ignoreAssetsPattern "!excludeme.txt" 
} 

Я также добавил:

sourceSets { 
    main { 
     java { 
      srcDir "src"    [I also tried w/o this line] 
      exclude "**/excludeme.txt" 
     } 
    } 
} 

Когда я выбрал Build > Clean Project, что вызвало сборку, я получил этот вывод, который показывает, что файл в папке ресурсов не был проигнорирован:

Information:Gradle tasks [clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources] 
C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Stopwatch\app\src\main\res\values\excludeme.txt 
Error:(1, 1) Error: Premature end of file. 
Error:Execution failed for task ':app:mergeDebugResources'. 
> C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Stopwatch\app\src\main\res\values\excludeme.txt:1:1: Error: Premature end of file. 

Результатов были такими же, если я удалил восклицательный знак:

aaptOptions { 
    ignoreAssetsPattern "!excludeme.txt" 
} 

Как правильно проинструктировать градлу игнорировать файлы, содержащие определенный шаблон при создании проектов Android?

Update 1

предложение

Per Стефана ниже, я добавил следующее в файл build.gradle для Module: app:

android { 
    [omitted] 
    sourceSets.main.res.exclude '**/whatever.txt' 
} 

Я добавил файл с именем whatever.txt в каталоге res/layout и сборки не удалось с:

Error:Execution failed for task ':app:mergeDebugResources'. 
> C:\Users\Ellen\GoogleDrive\Ellen-CS115\AndroidStudioProjects\Starbuzz\app\src\main\res\layout\whatever.txt: Error: The file name must end with .xml 

Update 2

За предложение Натана, я добавил:

packagingOptions { 
    exclude '**/whatever.txt' 
    exclude 'src/main/res/layout/whatever.txt' 
} 

к build.gradle (Module: app) в разделе android. Никаких улучшений:

Information:Gradle tasks [:app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources] 
/Users/spertus/GoogleDrive/Ellen-CS115/AndroidStudioProjects/MacTest/app/src/main/res/layout/whatever.txt 
Error:Error: The file name must end with .xml 
Error:Execution failed for task ':app:mergeDebugResources'. 
> /Users/spertus/GoogleDrive/Ellen-CS115/AndroidStudioProjects/MacTest/app/src/main/res/layout/whatever.txt: Error: The file name must end with .xml 
Information:BUILD FAILED 

(Эта последняя сборка была на Mac, в отличие от других, которые были на Windows.)

+0

документация Gradle на [файловых деревьев] (https://docs.gradle.org/current/userguide/working_with_files.html#sec:file_trees) может быть полезным. Есть ли причина для компиляции fileTree в разделе зависимостей сборки? Если вы будете исключать файлы из ваших ресурсов сборки, используйте блок ['sourceSet'] (https://docs.gradle.org/current/dsl/org.gradle.api.tasks.SourceSet.html). – Nathan

+0

Спасибо. Я не видел блок 'sourceSet' в любом из файлов' build.gradle'. Я посмотрю документацию, которую вы цитируете. –

+0

Если после нескольких попыток с 'sourceSet' вы столкнулись с проблемами, обновите свой ответ, и я увижу, смогу ли я помочь :) – Nathan

ответ

0

Андроида плагин имеет свою собственную концепцию SourceSets: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure

Таким образом, вы, вероятно, хотите сделать что-то вроде

android { 
    sourceSets.main.res.exclude '**/whatever.txt' 
} 
+0

Спасибо, но это не сработало. Я получил ту же ошибку, когда попытался поместить ее в файл build.gradle для приложения. –

0

В проекте детского, в вашем случае я считаю, что это :APP , добавьте следующее в файл build.gradle.

packagingOptions { 
    //Exclude the file(s) in this method. Provide the path and file name.  
    exclude 'src\main\res\layout\whatever.txt' 
} 

PackagingOptions DSL object позволяет контролировать, какие файлы включены в APK. exclude принимает строку или шаблон в качестве аргумента, который позволит вам игнорировать файлы или каталоги по имени или шаблону.

EDIT Настройка ресурсов, которые необходимо сохранить от Android Studio docs.

  1. Создайте файл XML в своем проекте с тегом <resources>.
  2. Добавить tools:keep="[list resources]"
  3. Добавить `инструменты: отбрасывать =«[список ресурсов]»
  4. Сохранить файл в ресурсах проекта на res/raw/keep.xml Строить не будет включать этот файл.

Конечный файл должен быть похож на тот, в Android Studio Docs

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:tools="http://schemas.android.com/tools" 
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*" 
    tools:discard="@layout/unused2" /> 
+1

Спасибо. откладывать обед до тестирования до истечения срока действия. :-) –

+0

Не помогло. Будет обновляться. –

+0

Изменить 'безотносительно.txt' в 'whatever.xml'. Поскольку он находится в папке макетов, Android может ожидать XML-файл. Процесс сборки для нескольких проектов может быть немного запутанным, чтобы отслеживать, какая задача выполняется сначала, без явного упорядочения каждого из них. Как только вы измените расширение, узнайте, какое сообщение об ошибке вы получите. – Nathan

1

Похоже, последние изменения в Gradle изменили DSL для sourceSets, так что вам теперь нужно указать исключения на поле фильтра :

android { 
    sourceSets.main.res.filter.exclude '**/whatever.txt' 
} 
+2

Спасибо. Это не работает для меня, используя Gradle 3.3 в Android Studio. Я не получаю сообщение об ошибке, но это не исключает файлы. Какую версию Gradle вы используете? –

+0

Gradle 3.3, с плагином Android 2.3.0. Одна вещь, о которой я забыл упомянуть, это то, что Android Studio будет * показывать * файлы в представлении проекта. Однако, когда приходит время для компиляции, файлы будут исключены/проигнорированы. Это не облегчало решение этой проблемы;) – Diarrhio

+0

Я пробовал это в обновлении 1. Это все еще не работает. Я получаю ту же ошибку в 'app: mergeDebugResources'. –