-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
Project.java
1732 lines (1604 loc) · 71.9 KB
/
Project.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Copyright 2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.api;
import groovy.lang.Closure;
import groovy.lang.DelegatesTo;
import groovy.lang.MissingPropertyException;
import groovy.transform.stc.ClosureParams;
import groovy.transform.stc.SimpleType;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.dsl.ArtifactHandler;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.artifacts.dsl.RepositoryHandler;
import org.gradle.api.component.SoftwareComponentContainer;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.ConfigurableFileTree;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.DeleteSpec;
import org.gradle.api.file.FileTree;
import org.gradle.api.file.ProjectLayout;
import org.gradle.api.initialization.dsl.ScriptHandler;
import org.gradle.api.internal.ReturnType;
import org.gradle.api.invocation.Gradle;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.LoggingManager;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.plugins.Convention;
import org.gradle.api.plugins.ExtensionAware;
import org.gradle.api.plugins.ExtensionContainer;
import org.gradle.api.plugins.PluginAware;
import org.gradle.api.provider.PropertyState;
import org.gradle.api.provider.Provider;
import org.gradle.api.provider.ProviderFactory;
import org.gradle.api.resources.ResourceHandler;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.WorkResult;
import org.gradle.internal.HasInternalProtocol;
import org.gradle.normalization.InputNormalizationHandler;
import org.gradle.process.ExecResult;
import org.gradle.process.ExecSpec;
import org.gradle.process.JavaExecSpec;
import javax.annotation.Nullable;
import java.io.File;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
/**
* <p>This interface is the main API you use to interact with Gradle from your build file. From a <code>Project</code>,
* you have programmatic access to all of Gradle's features.</p>
*
* <h3>Lifecycle</h3>
*
* <p>There is a one-to-one relationship between a <code>Project</code> and a <code>{@value #DEFAULT_BUILD_FILE}</code>
* file. During build initialisation, Gradle assembles a <code>Project</code> object for each project which is to
* participate in the build, as follows:</p>
*
* <ul>
*
* <li>Create a {@link org.gradle.api.initialization.Settings} instance for the build.</li>
*
* <li>Evaluate the <code>{@value org.gradle.api.initialization.Settings#DEFAULT_SETTINGS_FILE}</code> script, if
* present, against the {@link org.gradle.api.initialization.Settings} object to configure it.</li>
*
* <li>Use the configured {@link org.gradle.api.initialization.Settings} object to create the hierarchy of
* <code>Project</code> instances.</li>
*
* <li>Finally, evaluate each <code>Project</code> by executing its <code>{@value #DEFAULT_BUILD_FILE}</code> file, if
* present, against the project. The projects are evaluated in breadth-wise order, such that a project is evaluated
* before its child projects. This order can be overridden by calling <code>{@link #evaluationDependsOnChildren()}</code> or by adding an
* explicit evaluation dependency using <code>{@link #evaluationDependsOn(String)}</code>.</li>
*
* </ul>
*
* <h3>Tasks</h3>
*
* <p>A project is essentially a collection of {@link Task} objects. Each task performs some basic piece of work, such
* as compiling classes, or running unit tests, or zipping up a WAR file. You add tasks to a project using one of the
* {@code create()} methods on {@link TaskContainer}, such as {@link TaskContainer#create(String)}. You can locate existing
* tasks using one of the lookup methods on {@link TaskContainer}, such as {@link org.gradle.api.tasks.TaskCollection#getByName(String)}.</p>
*
* <h3>Dependencies</h3>
*
* <p>A project generally has a number of dependencies it needs in order to do its work. Also, a project generally
* produces a number of artifacts, which other projects can use. Those dependencies are grouped in configurations, and
* can be retrieved and uploaded from repositories. You use the {@link org.gradle.api.artifacts.ConfigurationContainer}
* returned by {@link #getConfigurations()} method to manage the configurations. The {@link
* org.gradle.api.artifacts.dsl.DependencyHandler} returned by {@link #getDependencies()} method to manage the
* dependencies. The {@link org.gradle.api.artifacts.dsl.ArtifactHandler} returned by {@link #getArtifacts()} method to
* manage the artifacts. The {@link org.gradle.api.artifacts.dsl.RepositoryHandler} returned by {@link
* #getRepositories()} method to manage the repositories.</p>
*
* <h3>Multi-project Builds</h3>
*
* <p>Projects are arranged into a hierarchy of projects. A project has a name, and a fully qualified path which
* uniquely identifies it in the hierarchy.</p>
*
* <h3>Plugins</h3>
*
* <p>
* Plugins can be used to modularise and reuse project configuration.
* Plugins can be applied using the {@link PluginAware#apply(java.util.Map)} method, or by using the {@link org.gradle.plugin.use.PluginDependenciesSpec plugins script block}.
* </p>
*
* <a name="properties"></a> <h3>Properties</h3>
*
* <p>Gradle executes the project's build file against the <code>Project</code> instance to configure the project. Any
* property or method which your script uses is delegated through to the associated <code>Project</code> object. This
* means, that you can use any of the methods and properties on the <code>Project</code> interface directly in your script.
* </p><p>For example:
* <pre>
* defaultTasks('some-task') // Delegates to Project.defaultTasks()
* reportsDir = file('reports') // Delegates to Project.file() and the Java Plugin
* </pre>
* <p>You can also access the <code>Project</code> instance using the <code>project</code> property. This can make the
* script clearer in some cases. For example, you could use <code>project.name</code> rather than <code>name</code> to
* access the project's name.</p>
*
* <p>A project has 5 property 'scopes', which it searches for properties. You can access these properties by name in
* your build file, or by calling the project's {@link #property(String)} method. The scopes are:</p>
*
* <ul>
*
* <li>The <code>Project</code> object itself. This scope includes any property getters and setters declared by the
* <code>Project</code> implementation class. For example, {@link #getRootProject()} is accessible as the
* <code>rootProject</code> property. The properties of this scope are readable or writable depending on the presence
* of the corresponding getter or setter method.</li>
*
* <li>The <em>extra</em> properties of the project. Each project maintains a map of extra properties, which
* can contain any arbitrary name -> value pair. Once defined, the properties of this scope are readable and writable.
* See <a href="#extraproperties">extra properties</a> for more details.</li>
*
* <li>The <em>extensions</em> added to the project by the plugins. Each extension is available as a read-only property with the same name as the extension.</li>
*
* <li>The <em>convention</em> properties added to the project by the plugins. A plugin can add properties and methods
* to a project through the project's {@link Convention} object. The properties of this scope may be readable or writable, depending on the convention objects.</li>
*
* <li>The tasks of the project. A task is accessible by using its name as a property name. The properties of this
* scope are read-only. For example, a task called <code>compile</code> is accessible as the <code>compile</code>
* property.</li>
*
* <li>The extra properties and convention properties inherited from the project's parent, recursively up to the root
* project. The properties of this scope are read-only.</li>
*
* </ul>
*
* <p>When reading a property, the project searches the above scopes in order, and returns the value from the first
* scope it finds the property in. If not found, an exception is thrown. See {@link #property(String)} for more details.</p>
*
* <p>When writing a property, the project searches the above scopes in order, and sets the property in the first scope
* it finds the property in. If not found, an exception is thrown. See {@link #setProperty(String, Object)} for more details.</p>
*
* <a name="extraproperties"></a> <h4>Extra Properties</h4>
*
* All extra properties must be defined through the "ext" namespace. Once an extra property has been defined,
* it is available directly on the owning object (in the below case the Project, Task, and sub-projects respectively) and can
* be read and updated. Only the initial declaration that needs to be done via the namespace.
*
* <pre>
* project.ext.prop1 = "foo"
* task doStuff {
* ext.prop2 = "bar"
* }
* subprojects { ext.${prop3} = false }
* </pre>
*
* Reading extra properties is done through the "ext" or through the owning object.
*
* <pre>
* ext.isSnapshot = version.endsWith("-SNAPSHOT")
* if (isSnapshot) {
* // do snapshot stuff
* }
* </pre>
*
* <h4>Dynamic Methods</h4>
*
* <p>A project has 5 method 'scopes', which it searches for methods:</p>
*
* <ul>
*
* <li>The <code>Project</code> object itself.</li>
*
* <li>The build file. The project searches for a matching method declared in the build file.</li>
*
* <li>The <em>extensions</em> added to the project by the plugins. Each extension is available as a method which takes
* a closure or {@link org.gradle.api.Action} as a parameter.</li>
*
* <li>The <em>convention</em> methods added to the project by the plugins. A plugin can add properties and method to
* a project through the project's {@link Convention} object.</li>
*
* <li>The tasks of the project. A method is added for each task, using the name of the task as the method name and
* taking a single closure or {@link org.gradle.api.Action} parameter. The method calls the {@link Task#configure(groovy.lang.Closure)} method for the
* associated task with the provided closure. For example, if the project has a task called <code>compile</code>, then a
* method is added with the following signature: <code>void compile(Closure configureClosure)</code>.</li>
*
* <li>The methods of the parent project, recursively up to the root project.</li>
*
* <li>A property of the project whose value is a closure. The closure is treated as a method and called with the provided parameters.
* The property is located as described above.</li>
*
* </ul>
*/
@HasInternalProtocol
public interface Project extends Comparable<Project>, ExtensionAware, PluginAware {
/**
* The default project build file name.
*/
String DEFAULT_BUILD_FILE = "build.gradle";
/**
* The hierarchy separator for project and task path names.
*/
String PATH_SEPARATOR = ":";
/**
* The default build directory name.
*/
String DEFAULT_BUILD_DIR_NAME = "build";
String GRADLE_PROPERTIES = "gradle.properties";
String SYSTEM_PROP_PREFIX = "systemProp";
String DEFAULT_VERSION = "unspecified";
String DEFAULT_STATUS = "release";
/**
* <p>Returns the root project for the hierarchy that this project belongs to. In the case of a single-project
* build, this method returns this project.</p>
*
* @return The root project. Never returns null.
*/
Project getRootProject();
/**
* <p>Returns the root directory of this project. The root directory is the project directory of the root
* project.</p>
*
* @return The root directory. Never returns null.
*/
File getRootDir();
/**
* <p>Returns the build directory of this project. The build directory is the directory which all artifacts are
* generated into. The default value for the build directory is <code><i>projectDir</i>/build</code></p>
*
* @return The build directory. Never returns null.
*/
File getBuildDir();
/**
* <p>Sets the build directory of this project. The build directory is the directory which all artifacts are
* generated into.</p>
*
* @param path The build directory
* @since 4.0
*/
void setBuildDir(File path);
/**
* <p>Sets the build directory of this project. The build directory is the directory which all artifacts are
* generated into. The path parameter is evaluated as described for {@link #file(Object)}. This mean you can use,
* amongst other things, a relative or absolute path or File object to specify the build directory.</p>
*
* @param path The build directory. This is evaluated as per {@link #file(Object)}
*/
void setBuildDir(Object path);
/**
* The build script for this project.
* <p>
* If the file exists, it will be evaluated against this project when this project is configured.
*
* @return the build script for this project.
*/
File getBuildFile();
/**
* <p>Returns the parent project of this project, if any.</p>
*
* @return The parent project, or null if this is the root project.
*/
Project getParent();
/**
* <p>Returns the name of this project. The project's name is not necessarily unique within a project hierarchy. You
* should use the {@link #getPath()} method for a unique identifier for the project.</p>
*
* @return The name of this project. Never return null.
*/
String getName();
/**
* Returns a human-consumable display name for this project.
*/
String getDisplayName();
/**
* Returns the description of this project, if any.
*
* @return the description. May return null.
*/
String getDescription();
/**
* Sets a description for this project.
*
* @param description The description of the project. Might be null.
*/
void setDescription(String description);
/**
* <p>Returns the group of this project. Gradle always uses the {@code toString()} value of the group. The group
* defaults to the path with dots as separators.</p>
*
* @return The group of this project. Never returns null.
*/
Object getGroup();
/**
* <p>Sets the group of this project.</p>
*
* @param group The group of this project. Must not be null.
*/
void setGroup(Object group);
/**
* <p>Returns the version of this project. Gradle always uses the {@code toString()} value of the version. The
* version defaults to {@value #DEFAULT_VERSION}.</p>
*
* @return The version of this project. Never returns null.
*/
Object getVersion();
/**
* <p>Sets the version of this project.</p>
*
* @param version The version of this project. Must not be null.
*/
void setVersion(Object version);
/**
* <p>Returns the status of this project. Gradle always uses the {@code toString()} value of the status. The status
* defaults to {@value #DEFAULT_STATUS}.</p>
*
* <p>The status of the project is only relevant, if you upload libraries together with a module descriptor. The
* status specified here, will be part of this module descriptor.</p>
*
* @return The status of this project. Never returns null.
*/
Object getStatus();
/**
* Sets the status of this project.
*
* @param status The status. Must not be null.
*/
void setStatus(Object status);
/**
* <p>Returns the direct children of this project.</p>
*
* @return A map from child project name to child project. Returns an empty map if this project does not have
* any children.
*/
Map<String, Project> getChildProjects();
/**
* <p>Sets a property of this project. This method searches for a property with the given name in the following
* locations, and sets the property on the first location where it finds the property.</p>
*
* <ol>
*
* <li>The project object itself. For example, the <code>rootDir</code> project property.</li>
*
* <li>The project's {@link Convention} object. For example, the <code>srcRootName</code> java plugin
* property.</li>
*
* <li>The project's extra properties.</li>
*
* </ol>
*
* If the property is not found, a {@link groovy.lang.MissingPropertyException} is thrown.
*
* @param name The name of the property
* @param value The value of the property
*/
void setProperty(String name, Object value) throws MissingPropertyException;
/**
* <p>Returns this project. This method is useful in build files to explicitly access project properties and
* methods. For example, using <code>project.name</code> can express your intent better than using
* <code>name</code>. This method also allows you to access project properties from a scope where the property may
* be hidden, such as, for example, from a method or closure. </p>
*
* @return This project. Never returns null.
*/
Project getProject();
/**
* <p>Returns the set containing this project and its subprojects.</p>
*
* @return The set of projects.
*/
Set<Project> getAllprojects();
/**
* <p>Returns the set containing the subprojects of this project.</p>
*
* @return The set of projects. Returns an empty set if this project has no subprojects.
*/
Set<Project> getSubprojects();
/**
* <p>Creates a {@link Task} with the given name and adds it to this project. Calling this method is equivalent to
* calling {@link #task(java.util.Map, String)} with an empty options map.</p>
*
* <p>After the task is added to the project, it is made available as a property of the project, so that you can
* reference the task by name in your build file. See <a href="#properties">here</a> for more details</p>
*
* <p>If a task with the given name already exists in this project, an exception is thrown.</p>
*
* @param name The name of the task to be created
* @return The newly created task object
* @throws InvalidUserDataException If a task with the given name already exists in this project.
*/
Task task(String name) throws InvalidUserDataException;
/**
* <p>Creates a {@link Task} with the given name and adds it to this project. A map of creation options can be
* passed to this method to control how the task is created. The following options are available:</p>
*
* <table>
*
* <tr><th>Option</th><th>Description</th><th>Default Value</th></tr>
*
* <tr><td><code>{@value org.gradle.api.Task#TASK_TYPE}</code></td><td>The class of the task to
* create.</td><td>{@link org.gradle.api.DefaultTask}</td></tr>
*
* <tr><td><code>{@value org.gradle.api.Task#TASK_OVERWRITE}</code></td><td>Replace an existing
* task?</td><td><code>false</code></td></tr>
*
*
* <tr><td><code>{@value org.gradle.api.Task#TASK_DEPENDS_ON}</code></td><td>A task name or set of task names which
* this task depends on</td><td><code>[]</code></td></tr>
*
* <tr><td><code>{@value org.gradle.api.Task#TASK_ACTION}</code></td><td>A closure or {@link Action} to add to the
* task.</td><td><code>null</code></td></tr>
*
* <tr><td><code>{@value org.gradle.api.Task#TASK_DESCRIPTION}</code></td><td>A description of the task.
* </td><td><code>null</code></td></tr>
*
* <tr><td><code>{@value org.gradle.api.Task#TASK_GROUP}</code></td><td>A task group which this task belongs to.
* </td><td><code>null</code></td></tr>
*
* </table>
*
* <p>After the task is added to the project, it is made available as a property of the project, so that you can
* reference the task by name in your build file. See <a href="#properties">here</a> for more details</p>
*
* <p>If a task with the given name already exists in this project and the <code>override</code> option is not set
* to true, an exception is thrown.</p>
*
* @param args The task creation options.
* @param name The name of the task to be created
* @return The newly created task object
* @throws InvalidUserDataException If a task with the given name already exists in this project.
*/
Task task(Map<String, ?> args, String name) throws InvalidUserDataException;
/**
* <p>Creates a {@link Task} with the given name and adds it to this project. Before the task is returned, the given
* closure is executed to configure the task. A map of creation options can be passed to this method to control how
* the task is created. See {@link #task(java.util.Map, String)} for the available options.</p>
*
* <p>After the task is added to the project, it is made available as a property of the project, so that you can
* reference the task by name in your build file. See <a href="#properties">here</a> for more details</p>
*
* <p>If a task with the given name already exists in this project and the <code>override</code> option is not set
* to true, an exception is thrown.</p>
*
* @param args The task creation options.
* @param name The name of the task to be created
* @param configureClosure The closure to use to configure the created task.
* @return The newly created task object
* @throws InvalidUserDataException If a task with the given name already exists in this project.
*/
Task task(Map<String, ?> args, String name, @DelegatesTo(value = Task.class, strategy = Closure.DELEGATE_FIRST) @ClosureParams(ReturnType.class) Closure configureClosure);
/**
* <p>Creates a {@link Task} with the given name and adds it to this project. Before the task is returned, the given
* closure is executed to configure the task.</p> <p>After the task is added to the project, it is made
* available as a property of the project, so that you can reference the task by name in your build file. See <a
* href="#properties">here</a> for more details</p>
*
* @param name The name of the task to be created
* @param configureClosure The closure to use to configure the created task.
* @return The newly created task object
* @throws InvalidUserDataException If a task with the given name already exists in this project.
*/
Task task(String name, @DelegatesTo(value = Task.class, strategy = Closure.DELEGATE_FIRST) @ClosureParams(ReturnType.class) Closure configureClosure);
/**
* <p>Returns the path of this project. The path is the fully qualified name of the project.</p>
*
* @return The path. Never returns null.
*/
String getPath();
/**
* <p>Returns the names of the default tasks of this project. These are used when no tasks names are provided when
* starting the build.</p>
*
* @return The default task names. Returns an empty list if this project has no default tasks.
*/
List<String> getDefaultTasks();
/**
* <p>Sets the names of the default tasks of this project. These are used when no tasks names are provided when
* starting the build.</p>
*
* @param defaultTasks The default task names.
*/
void setDefaultTasks(List<String> defaultTasks);
/**
* <p>Sets the names of the default tasks of this project. These are used when no tasks names are provided when
* starting the build.</p>
*
* @param defaultTasks The default task names.
*/
void defaultTasks(String... defaultTasks);
/**
* <p>Declares that this project has an evaluation dependency on the project with the given path.</p>
*
* @param path The path of the project which this project depends on.
* @return The project which this project depends on.
* @throws UnknownProjectException If no project with the given path exists.
*/
Project evaluationDependsOn(String path) throws UnknownProjectException;
/**
* <p>Declares that this project has an evaluation dependency on each of its child projects.</p>
*
*/
void evaluationDependsOnChildren();
/**
* <p>Locates a project by path. If the path is relative, it is interpreted relative to this project.</p>
*
* @param path The path.
* @return The project with the given path. Returns null if no such project exists.
*/
Project findProject(String path);
/**
* <p>Locates a project by path. If the path is relative, it is interpreted relative to this project.</p>
*
* @param path The path.
* @return The project with the given path. Never returns null.
* @throws UnknownProjectException If no project with the given path exists.
*/
Project project(String path) throws UnknownProjectException;
/**
* <p>Locates a project by path and configures it using the given closure. If the path is relative, it is
* interpreted relative to this project. The target project is passed to the closure as the closure's delegate.</p>
*
* @param path The path.
* @param configureClosure The closure to use to configure the project.
* @return The project with the given path. Never returns null.
* @throws UnknownProjectException If no project with the given path exists.
*/
Project project(String path, @DelegatesTo(value = Project.class, strategy = Closure.DELEGATE_FIRST) @ClosureParams(ReturnType.class) Closure configureClosure);
/**
* <p>Locates a project by path and configures it using the given action. If the path is relative, it is
* interpreted relative to this project.</p>
*
* @param path The path.
* @param configureAction The action to use to configure the project.
* @return The project with the given path. Never returns null.
* @throws UnknownProjectException If no project with the given path exists.
*
* @since 3.4
*/
Project project(String path, Action<? super Project> configureAction);
/**
* <p>Returns a map of the tasks contained in this project, and optionally its subprojects.</p>
*
* @param recursive If true, returns the tasks of this project and its subprojects. If false, returns the tasks of
* just this project.
* @return A map from project to a set of tasks.
*/
Map<Project, Set<Task>> getAllTasks(boolean recursive);
/**
* <p>Returns the set of tasks with the given name contained in this project, and optionally its subprojects.</p>
*
* @param name The name of the task to locate.
* @param recursive If true, returns the tasks of this project and its subprojects. If false, returns the tasks of
* just this project.
* @return The set of tasks. Returns an empty set if no such tasks exist in this project.
*/
Set<Task> getTasksByName(String name, boolean recursive);
/**
* <p>The directory containing the project build file.</p>
*
* @return The project directory. Never returns null.
*/
File getProjectDir();
/**
* <p>Resolves a file path relative to the project directory of this project. This method converts the supplied path
* based on its type:</p>
*
* <ul>
*
* <li>A {@link CharSequence}, including {@link String} or {@link groovy.lang.GString}. Interpreted relative to the project directory. A string
* that starts with {@code file:} is treated as a file URL.</li>
*
* <li>A {@link File}. If the file is an absolute file, it is returned as is. Otherwise, the file's path is
* interpreted relative to the project directory.</li>
*
* <li>A {@link java.nio.file.Path}. The path must be associated with the default provider and is treated the
* same way as an instance of {@code File}.</li>
*
* <li>A {@link java.net.URI} or {@link java.net.URL}. The URL's path is interpreted as the file path. Only {@code file:} URLs are supported.</li>
*
* <li>A {@link org.gradle.api.file.Directory} or {@link org.gradle.api.file.RegularFile}.</li>
*
* <li>A {@link Provider} of any supported type. The provider's value is resolved recursively.</li>
*
* <li>A {@link Closure} that returns any supported type. The closure's return value is resolved recursively.</li>
*
* <li>A {@link java.util.concurrent.Callable} that returns any supported type. The callable's return value is resolved recursively.</li>
*
* </ul>
*
* @param path The object to resolve as a File.
* @return The resolved file. Never returns null.
*/
File file(Object path);
/**
* <p>Resolves a file path relative to the project directory of this project and validates it using the given
* scheme. See {@link PathValidation} for the list of possible validations.</p>
*
* @param path An object which toString method value is interpreted as a relative path to the project directory.
* @param validation The validation to perform on the file.
* @return The resolved file. Never returns null.
* @throws InvalidUserDataException When the file does not meet the given validation constraint.
*/
File file(Object path, PathValidation validation) throws InvalidUserDataException;
/**
* <p>Resolves a file path to a URI, relative to the project directory of this project. Evaluates the provided path
* object as described for {@link #file(Object)}, with the exception that any URI scheme is supported, not just
* 'file:' URIs.</p>
*
* @param path The object to resolve as a URI.
* @return The resolved URI. Never returns null.
*/
URI uri(Object path);
/**
* <p>Returns the relative path from the project directory to the given path. The given path object is (logically)
* resolved as described for {@link #file(Object)}, from which a relative path is calculated.</p>
*
* @param path The path to convert to a relative path.
* @return The relative path. Never returns null.
*/
String relativePath(Object path);
/**
* <p>Returns a {@link ConfigurableFileCollection} containing the given files. You can pass any of the following
* types to this method:</p>
*
* <ul> <li>A {@link CharSequence}, including {@link String} or {@link groovy.lang.GString}. Interpreted relative to the project directory, as per {@link #file(Object)}. A string that starts with {@code file:} is treated as a file URL.</li>
*
* <li>A {@link File}. Interpreted relative to the project directory, as per {@link #file(Object)}.</li>
*
* <li>A {@link java.nio.file.Path} as defined by {@link #file(Object)}.</li>
*
* <li>A {@link java.net.URI} or {@link java.net.URL}. The URL's path is interpreted as a file path. Only {@code file:} URLs are supported.</li>
*
* <li>A {@link org.gradle.api.file.Directory} or {@link org.gradle.api.file.RegularFile}.</li>
*
* <li>A {@link java.util.Collection}, {@link Iterable}, or an array that contains objects of any supported type. The elements of the collection are recursively converted to files.</li>
*
* <li>A {@link org.gradle.api.file.FileCollection}. The contents of the collection are included in the returned collection.</li>
*
* <li>A {@link Provider} of any supported type. The provider's value is recursively converted to files.
*
* <li>A {@link java.util.concurrent.Callable} that returns any supported type. The return value of the {@code call()} method is recursively converted to files. A {@code null} return value is treated as an empty collection.</li>
*
* <li>A {@link Closure} that returns any of the types listed here. The return value of the closure is recursively converted to files. A {@code null} return value is treated as an empty collection.</li>
*
* <li>A {@link Task}. Converted to the task's output files.</li>
*
* <li>A {@link org.gradle.api.tasks.TaskOutputs}. Converted to the output files the related task.</li>
*
* <li>Anything else is treated as a failure.</li>
*
* </ul>
*
* <p>The returned file collection is lazy, so that the paths are evaluated only when the contents of the file
* collection are queried. The file collection is also live, so that it evaluates the above each time the contents
* of the collection is queried.</p>
*
* <p>The returned file collection maintains the iteration order of the supplied paths.</p>
*
* @param paths The paths to the files. May be empty.
* @return The file collection. Never returns null.
*/
ConfigurableFileCollection files(Object... paths);
/**
* <p>Creates a new {@code ConfigurableFileCollection} using the given paths. The paths are evaluated as per {@link
* #files(Object...)}. The file collection is configured using the given closure. The file collection is passed to
* the closure as its delegate. Example:</p>
* <pre>
* files "$buildDir/classes" {
* builtBy 'compile'
* }
* </pre>
* <p>The returned file collection is lazy, so that the paths are evaluated only when the contents of the file
* collection are queried. The file collection is also live, so that it evaluates the above each time the contents
* of the collection is queried.</p>
*
* @param paths The contents of the file collection. Evaluated as per {@link #files(Object...)}.
* @param configureClosure The closure to use to configure the file collection.
* @return the configured file tree. Never returns null.
*/
ConfigurableFileCollection files(Object paths, @DelegatesTo(value = ConfigurableFileCollection.class, strategy = Closure.DELEGATE_FIRST) @ClosureParams(ReturnType.class) Closure configureClosure);
/**
* <p>Creates a new {@code ConfigurableFileCollection} using the given paths. The paths are evaluated as per {@link
* #files(Object...)}. The file collection is configured using the given action. Example:</p>
* <pre>
* files "$buildDir/classes" {
* builtBy 'compile'
* }
* </pre>
* <p>The returned file collection is lazy, so that the paths are evaluated only when the contents of the file
* collection are queried. The file collection is also live, so that it evaluates the above each time the contents
* of the collection is queried.</p>
*
* @param paths The contents of the file collection. Evaluated as per {@link #files(Object...)}.
* @param configureAction The action to use to configure the file collection.
* @return the configured file tree. Never returns null.
* @since 3.5
*/
ConfigurableFileCollection files(Object paths, Action<? super ConfigurableFileCollection> configureAction);
/**
* <p>Creates a new {@code ConfigurableFileTree} using the given base directory. The given baseDir path is evaluated
* as per {@link #file(Object)}.</p>
*
* <p>The returned file tree is lazy, so that it scans for files only when the contents of the file tree are
* queried. The file tree is also live, so that it scans for files each time the contents of the file tree are
* queried.</p>
*
* <pre autoTested=''>
* def myTree = fileTree("src")
* myTree.include "**/*.java"
* myTree.builtBy "someTask"
*
* task copy(type: Copy) {
* from myTree
* }
* </pre>
*
* @param baseDir The base directory of the file tree. Evaluated as per {@link #file(Object)}.
* @return the file tree. Never returns null.
*/
ConfigurableFileTree fileTree(Object baseDir);
/**
* <p>Creates a new {@code ConfigurableFileTree} using the given base directory. The given baseDir path is evaluated
* as per {@link #file(Object)}. The closure will be used to configure the new file tree.
* The file tree is passed to the closure as its delegate. Example:</p>
*
* <pre autoTested=''>
* def myTree = fileTree('src') {
* exclude '**/.data/**'
* builtBy 'someTask'
* }
*
* task copy(type: Copy) {
* from myTree
* }
* </pre>
*
* <p>The returned file tree is lazy, so that it scans for files only when the contents of the file tree are
* queried. The file tree is also live, so that it scans for files each time the contents of the file tree are
* queried.</p>
*
* @param baseDir The base directory of the file tree. Evaluated as per {@link #file(Object)}.
* @param configureClosure Closure to configure the {@code ConfigurableFileTree} object.
* @return the configured file tree. Never returns null.
*/
ConfigurableFileTree fileTree(Object baseDir, @DelegatesTo(value = ConfigurableFileTree.class, strategy = Closure.DELEGATE_FIRST) @ClosureParams(ReturnType.class) Closure configureClosure);
/**
* <p>Creates a new {@code ConfigurableFileTree} using the given base directory. The given baseDir path is evaluated
* as per {@link #file(Object)}. The action will be used to configure the new file tree. Example:</p>
*
* <pre autoTested=''>
* def myTree = fileTree('src') {
* exclude '**/.data/**'
* builtBy 'someTask'
* }
*
* task copy(type: Copy) {
* from myTree
* }
* </pre>
*
* <p>The returned file tree is lazy, so that it scans for files only when the contents of the file tree are
* queried. The file tree is also live, so that it scans for files each time the contents of the file tree are
* queried.</p>
*
* @param baseDir The base directory of the file tree. Evaluated as per {@link #file(Object)}.
* @param configureAction Action to configure the {@code ConfigurableFileTree} object.
* @return the configured file tree. Never returns null.
* @since 3.5
*/
ConfigurableFileTree fileTree(Object baseDir, Action<? super ConfigurableFileTree> configureAction);
/**
* <p>Creates a new {@code ConfigurableFileTree} using the provided map of arguments. The map will be applied as
* properties on the new file tree. Example:</p>
*
* <pre autoTested=''>
* def myTree = fileTree(dir:'src', excludes:['**/ignore/**', '**/.data/**'])
*
* task copy(type: Copy) {
* from myTree
* }
* </pre>
*
* <p>The returned file tree is lazy, so that it scans for files only when the contents of the file tree are
* queried. The file tree is also live, so that it scans for files each time the contents of the file tree are
* queried.</p>
*
* @param args map of property assignments to {@code ConfigurableFileTree} object
* @return the configured file tree. Never returns null.
*/
ConfigurableFileTree fileTree(Map<String, ?> args);
/**
* <p>Creates a new {@code FileTree} which contains the contents of the given ZIP file. The given zipPath path is
* evaluated as per {@link #file(Object)}. You can combine this method with the {@link #copy(groovy.lang.Closure)}
* method to unzip a ZIP file.</p>
*
* <p>The returned file tree is lazy, so that it scans for files only when the contents of the file tree are
* queried. The file tree is also live, so that it scans for files each time the contents of the file tree are
* queried.</p>
*
* @param zipPath The ZIP file. Evaluated as per {@link #file(Object)}.
* @return the file tree. Never returns null.
*/
FileTree zipTree(Object zipPath);
/**
* Creates a new {@code FileTree} which contains the contents of the given TAR file. The given tarPath path can be:
* <ul>
* <li>an instance of {@link org.gradle.api.resources.Resource}</li>
* <li>any other object is evaluated as per {@link #file(Object)}</li>
* </ul>
*
* The returned file tree is lazy, so that it scans for files only when the contents of the file tree are
* queried. The file tree is also live, so that it scans for files each time the contents of the file tree are
* queried.
* <p>
* Unless custom implementation of resources is passed, the tar tree attempts to guess the compression based on the file extension.
* <p>
* You can combine this method with the {@link #copy(groovy.lang.Closure)}
* method to untar a TAR file:
*
* <pre autoTested=''>
* task untar(type: Copy) {
* from tarTree('someCompressedTar.gzip')
*
* //tar tree attempts to guess the compression based on the file extension
* //however if you must specify the compression explicitly you can:
* from tarTree(resources.gzip('someTar.ext'))
*
* //in case you work with unconventionally compressed tars
* //you can provide your own implementation of a ReadableResource:
* //from tarTree(yourOwnResource as ReadableResource)
*
* into 'dest'
* }
* </pre>
*
* @param tarPath The TAR file or an instance of {@link org.gradle.api.resources.Resource}.
* @return the file tree. Never returns null.
*/
FileTree tarTree(Object tarPath);
/**
* Creates a {@code Provider} implementation based on the provided value.
*
* @param value The {@code java.util.concurrent.Callable} use to calculate the value.
* @return The provider. Never returns null.
* @throws org.gradle.api.InvalidUserDataException If the provided value is null.
* @see org.gradle.api.provider.ProviderFactory#provider(Callable)
* @since 4.0
*/
@Incubating
<T> Provider<T> provider(Callable<T> value);
/**
* Creates a {@code PropertyState} implementation based on the provided class.
*
* @param clazz The class to be used for property state.
* @return The property state. Never returns null.
* @throws org.gradle.api.InvalidUserDataException If the provided class is null.
* @see org.gradle.api.provider.ProviderFactory#property(Class)
* @since 4.0
*/
@Incubating
<T> PropertyState<T> property(Class<T> clazz);
/**
* Provides access to methods to create various kinds of {@link Provider} instances.
*
* @since 4.0
*/
@Incubating
ProviderFactory getProviders();
/**
* Provides access to methods to create various kinds of model objects.
*
* @since 4.0
*/
@Incubating
ObjectFactory getObjects();
/**
* Provides access to various important directories for this project.
*
* @since 4.1
*/
@Incubating
ProjectLayout getLayout();
/**
* Creates a directory and returns a file pointing to it.
*
* @param path The path for the directory to be created. Evaluated as per {@link #file(Object)}.
* @return the created directory
* @throws org.gradle.api.InvalidUserDataException If the path points to an existing file.
*/
File mkdir(Object path);
/**
* Deletes files and directories.
* <p>
* This will not follow symlinks. If you need to follow symlinks too use {@link #delete(Action)}.
*
* @param paths Any type of object accepted by {@link org.gradle.api.Project#files(Object...)}
* @return true if anything got deleted, false otherwise
*/
boolean delete(Object... paths);
/**
* Deletes the specified files. The given action is used to configure a {@link DeleteSpec}, which is then used to
* delete the files.
* <p>Example:
* <pre>
* project.delete {
* delete 'somefile'
* followSymlinks = true
* }