Иконка ресурса

Модульный проект

Merisen добавил(а) новый ресурс:

Модульный проект - Разделение проекта на модули для "удобности" билда

Фича о которой мало кто знает и которая действительно помогает.
Всплывает она в нескольких вариантах:
  • вам нужно разделить мод на клиент-сервер
  • вам лень на каждый мод делать отдельный воркспейс и ждать пока он установиться и вы наконец-то сможете творить
  • вы вдруг захотели выгребнуться что умеете создавать модули
Для того чтоб все эти манипуляции произвести вам понадобиться установить сам проект(или можете делать на старом, как хотите)...

Узнать больше об этом ресурсе...
 
477
7
51
Очень полезно, спасибо!
 

Icosider

Kotliner
Администратор
3,600
99
663
Это сабпроджекты и в случаи большого числа сабпроджектов с внутренними модулями данный способ не сработает.
 
1,159
38
544
Не могу подключить сабпроджект в основном build.gradle. Ругается на include:

Код:
buildscript {
    repositories {
        jcenter()
        mavenCentral()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
        maven {
            name = "sonatype"
            url = "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.1'  // 1.8.4 не юзается, т.к. он не работает нифига
    }
}

apply plugin: 'forge'

version = "0.3.0"
group= "ru.rarescrap.weightapi" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "weightapi"
def publicationVersion = version+'_1.7.10'

// read-only поле, чтоб его...
//rootProject.name = archivesBaseName // имя главного проекта

/* название наших модулей */
include 'examples' // !!! ОШИБКА !!!

minecraft {
    version = "1.7.10-10.13.4.1614-1.7.10"
    runDir = "eclipse"
}

dependencies {
    // you may put jars on which you depend on in ./libs
    // or you may define them like so..
    //compile "some.group:artifact:version:classifier"
    //compile "some.group:artifact:version"
     
    // real examples
    //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev'  // adds buildcraft to the dev env
    //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env

    // for more info...
    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
    // http://www.gradle.org/docs/current/userguide/dependency_management.html

}

processResources
{
    // this will ensure that this task is redone when the versions change.
    inputs.property "version", project.version
    inputs.property "mcversion", project.minecraft.version

    // replace stuff in mcmod.info, nothing else
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod.info'
               
        // replace version and mcversion
        expand 'version':project.version, 'mcversion':project.minecraft.version
    }
       
    // copy everything else, thats not the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}

// Собираем бинарник мода без обфускации. Рабочий вариант, в отличие от оф. доков из ForgeGradle
task deobfJar(type: Jar) {
    classifier "dev"
    from sourceSets.main.output
}

// Формирует jar'ник с доками
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

// Формирует jar'ник с исходниками
task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

// Подготавливает maven-публикацию, которая будет использоваться в bintray
// Именно тут определяются артефакты для публикации
apply plugin: 'maven-publish'
publishing {
    publications {
        BintrayPublication(MavenPublication) {
            //from components.java // Артефакты по умолчанию. Отлючаем их, т.к. нам нужно артефакт main-модуля заменить на артефакт от api-модуля
            groupId group
            artifactId archivesBaseName
            version publicationVersion
            artifact deobfJar
            artifact sourcesJar
            artifact javadocJar
        }
    }
}

// Публикация либы в bintray/jcenter
apply plugin: 'com.jfrog.bintray'
bintray {
    user = 'rarescrap'
    key = System.getenv('BINTRAY_KEY')
    publications = ['BintrayPublication']
    pkg {
        repo = 'minecraft'
        name = 'weight-api'
        licenses = ['GPL-3.0']
        vcsUrl = 'https://github.com/RareScrap/WeightAPI.git'
        version {
            name = publicationVersion
            released  = new Date()
        }
    }
}

// Чтоб idea смогла запаковать ресурсы в джарник
idea { module { inheritOutputDirs = true } }

// Поддержка руских букв в доках
javadoc { options.encoding = 'UTF-8' }
// Устраняет ошибки и предупреждения компиляции из-за русских комментов
compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }


Код:
Build script error, unsupported Gradle DSL method found: 'include()'!

Possible causes could be:
  - you are using Gradle version where the method is absent (Fix Gradle settings)
  - you didn't apply Gradle plugin which provides the method (Apply Gradle plugin)
  - or there is a mistake in a build script (Goto source)
Open File

Юзаю Gradle 2.0, который шел из коробки форжа 1.7.10
 
подключить сабпроджект
Тебе не нужно писать инклуд в билде, надо создать settings.gradle и уже в нем написать инклуды проектов которые ты создал.

Вот пишет:
Код:
rootProject.name = "ProjectName" // имя главного проекта

/* название наших модулей */
include 'ClientMod'
include 'ServerMod'
 
1,159
38
544
Как градл поймет что следует заюзать этот файл?

Изменять имя проекта мне не нужно, так что делать этого я не буду. Вот скажи как заставить градл инклюдить проект в поддиректории?

Код:
//rootProject.name = "ProjectName" // имя главного проекта

/* название наших модулей */
include 'examples/case1'
//include 'src'

Выдает:
Код:
Build script error, unsupported Gradle DSL method found: 'getPluginManager()'!

Possible causes could be: 
  - you are using Gradle version where the method is absent (Fix Gradle settings)
  - you didn't apply Gradle plugin which provides the method (Apply Gradle plugin)
  - or there is a mistake in a build script (Goto source)
 
Последнее редактирование:
следует заюзать этот файл
Потому что это файл настроек. И в сеттинге не надо комментить главный проект, так как он и будет подхвачен.
Screen Shot 2019-06-15 at 8.39.07 PM.jpg
В главном файле build.gradle не нужно ничего инклудить и добавлять. Все инклуды в сеттинге.
Код:
import ru.justagod.mineplugin.MinePlugin

buildscript {
    repositories {
        mavenCentral()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
        maven {
            name = "sonatype"
            url = "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.61"
    }
}

apply plugin: 'groovy'
apply plugin: 'forge'
apply plugin: 'kotlin'
apply plugin: MinePlugin

// archivesBaseName = "NAME-client"
// archivesBaseName = "NAME-server"
archivesBaseName = "NAME"

minecraft {
    version = "1.7.10-10.13.4.1558-1.7.10"
    runDir = "idea"
}

compileJava {
    targetCompatibility = JavaVersion.VERSION_1_8
    sourceCompatibility = JavaVersion.VERSION_1_8
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.61"
}

jar {
    destinationDir = file("$rootDir/compiled")
}

processResources {
    inputs.property "version", project.version
    inputs.property "mcversion", project.minecraft.version
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod.info'
        expand 'version': project.version, 'mcversion': project.minecraft.version
    }
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}

idea {
    module {
        inheritOutputDirs = true
    }
}
Код:
rootProject.name = "TestMC" // имя главного проекта

/* название наших модулей */
include 'subproject1'
include 'subproject2'
Код:
apply plugin: 'java'

apply from: "$rootDir/build.gradle"

version = ""
archivesBaseName = "subproject1"

sourceCompatibility = 1.8
Код:
apply plugin: 'java'

apply from: "$rootDir/build.gradle"

version = ""
archivesBaseName = "subproject2"

sourceCompatibility = 1.8
 
1,159
38
544
@Merisen У меня субпроджект лежит в "examples/case1". Как заставить градл инклюдить проект, вложенный в папку?

UPD:
Нашел решение, но на grdale 2.0 не пашет. Пришлось обновиться до 4.4.1.

Теперь осталось выяснить как при запуске клиента билдить субпроджект и включать его в список модов.
 
Последнее редактирование:

Icosider

Kotliner
Администратор
3,600
99
663
@RareScrap, ну что за костыли, и будет у тебя "modules" отдельным модулем. В начале делаешь include, затем достаёшь этот же проект и задаёшь ему папку. Всё!
 

Icosider

Kotliner
Администратор
3,600
99
663
@Merisen, создавать в каждом модуле ещё модули сервер/клиент крайне глупо...
 
1,159
38
544
В начале делаешь include, затем достаёшь этот же проект и задаёшь ему папку.
Какая логика в том, чтобы субпрождектам задавать папку проекта-родителя? Да и честно сказать я вообще не понял что ты хотел сказать своим постом.
 
Последнее редактирование:

Icosider

Kotliner
Администратор
3,600
99
663
@RareScrap, :m_faceplam:
Java:
include 'mygovnoModule'
project(":mygovnoModule").projectDir = file("myfolder/mygovnoModule")
И всё! Будет тебе модуль в отдельной папке без создания модуля "myfolder", и я хз причём тут родительская директория.
 
1,159
38
544
И всё! Будет тебе модуль в отдельной папке без создания модуля "myfolder"
Спасибо, ивасик. Стало лучше чем было. Но все равно странно что при include ':folder:subproject' создается модуль "folder", а в нем еще модуль "subproject". Интересная фича градла...
 
1,159
38
544
Вот еще немного инфы про модульный проект. Оно будет полезно для тех, кто в качестве модулей использует отдельные моды.
 
То что я и искал, только подскажите я хочу сделать по типу project red'a. Тогда основным модом будет ядро а сабами расширения?
 
1,159
38
544
То что я и искал, только подскажите я хочу сделать по типу project red'a. Тогда основным модом будет ядро а сабами расширения?
Да, как тебе ответил @RareScrap, если будут вопросы о реализации - задавай сюда или же в лс.
 
1,159
38
544
При запуске игры через среду, все моды ведь должны быть загружены?
Если сабпроджекты у тебя подразумевают отдельные моды, то тот мод который ты запускаешь должен иметь от них runtimeOnly зависимость.
 
1,007
36
206
Просто я сделал как в гайде, а у меня всё равно только один мод в игре работает(другой он не видит)
 
Сверху