• Гость, публикуйте свои сливы кода через Ресурсы!
    После публикации слива в Ресурсах в этом форуме будет автоматически создана тема для обсуждения.
Иконка ресурса

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

Merisen

Каменная лига
Сообщения
136
Лучшие ответы
3
Симпатии
25
#1
Merisen добавил(а) новый ресурс:

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

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

MrGufiks

Каменная лига
Сообщения
256
Лучшие ответы
5
Симпатии
14
#2
Очень полезно, спасибо!
 

Ivasik

Porting GrandBombaster
Команда форума
Сообщения
2,710
Лучшие ответы
76
Симпатии
270
#3
Это сабпроджекты и в случаи большого числа сабпроджектов с внутренними модулями данный способ не сработает.
 

RareScrap

Каменная лига
Сообщения
677
Лучшие ответы
22
Симпатии
171
#4
Не могу подключить сабпроджект в основном build.gradle. Ругается на include:

build.gradle:
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
 

Merisen

Каменная лига
Сообщения
136
Лучшие ответы
3
Симпатии
25
#5
Тебе не нужно писать инклуд в билде, надо создать settings.gradle и уже в нем написать инклуды проектов которые ты создал.

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

/* название наших модулей */
include 'ClientMod'
include 'ServerMod'
 

RareScrap

Каменная лига
Сообщения
677
Лучшие ответы
22
Симпатии
171
#6
Как градл поймет что следует заюзать этот файл?

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

settings.gradle:
//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)
 
Последнее редактирование:

Merisen

Каменная лига
Сообщения
136
Лучшие ответы
3
Симпатии
25
#7
следует заюзать этот файл
Потому что это файл настроек. И в сеттинге не надо комментить главный проект, так как он и будет подхвачен.
Screen Shot 2019-06-15 at 8.39.07 PM.jpg
В главном файле build.gradle не нужно ничего инклудить и добавлять. Все инклуды в сеттинге.
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
    }
}
settings.gradle:
rootProject.name = "TestMC" // имя главного проекта

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

apply from: "$rootDir/build.gradle"

version = ""
archivesBaseName = "subproject1"

sourceCompatibility = 1.8
subproject2:
apply plugin: 'java'

apply from: "$rootDir/build.gradle"

version = ""
archivesBaseName = "subproject2"

sourceCompatibility = 1.8
 

RareScrap

Каменная лига
Сообщения
677
Лучшие ответы
22
Симпатии
171
#8
@Merisen У меня субпроджект лежит в "examples/case1". Как заставить градл инклюдить проект, вложенный в папку?

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

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

Ivasik

Porting GrandBombaster
Команда форума
Сообщения
2,710
Лучшие ответы
76
Симпатии
270
#9
@RareScrap, ну что за костыли, и будет у тебя "modules" отдельным модулем. В начале делаешь include, затем достаёшь этот же проект и задаёшь ему папку. Всё!
 

Ivasik

Porting GrandBombaster
Команда форума
Сообщения
2,710
Лучшие ответы
76
Симпатии
270
#10
@Merisen, создавать в каждом модуле ещё модули сервер/клиент крайне глупо...
 

RareScrap

Каменная лига
Сообщения
677
Лучшие ответы
22
Симпатии
171
#11
В начале делаешь include, затем достаёшь этот же проект и задаёшь ему папку.
Какая логика в том, чтобы субпрождектам задавать папку проекта-родителя? Да и честно сказать я вообще не понял что ты хотел сказать своим постом.
 
Последнее редактирование:

Ivasik

Porting GrandBombaster
Команда форума
Сообщения
2,710
Лучшие ответы
76
Симпатии
270
#12
@RareScrap, :m_faceplam:
Java:
include 'mygovnoModule'
project(":mygovnoModule").projectDir = file("myfolder/mygovnoModule")
И всё! Будет тебе модуль в отдельной папке без создания модуля "myfolder", и я хз причём тут родительская директория.
 

RareScrap

Каменная лига
Сообщения
677
Лучшие ответы
22
Симпатии
171
#13
И всё! Будет тебе модуль в отдельной папке без создания модуля "myfolder"
Спасибо, ивасик. Стало лучше чем было. Но все равно странно что при include ':folder:subproject' создается модуль "folder", а в нем еще модуль "subproject". Интересная фича градла...
 
Сверху