- Версия(и) Minecraft
- 1.7.10+
Что это такое
Вырезалка это плагин для градла. Она нужна для автоматического вырезания клиентского кода из серверных билдов.
Разграничение серверного кода и клиентского происходит через аннотации.
Установка
Тут все стало значительно проще. Я все-таки обзавелся доменом в мавен централе и теперь применение снапшота выглядит вот так:
Stable версии уже стоит смотреть в поиске.
Пример для 1.7.10
И для 1.8
Настройка
Вырезалка довольно гибкий в настройке плагин, но мне сказали, что гибкость не нужна. Нужно что б все было просто.
Теперь настройка представляет из себя одну строку
1 true - включать ли дефолтную либу вырезалки в целевой жарник
2 false - включать ли эвристику (о ней позже)
Ее нужно сунуть где то в конец вашего build.gradle но до секции dependencies.
С более брутальной настройкой вы можете ознакомится в репозитории: Cutter
Примеры
Вырезалка добавит 3 таска: buildClient, buildServer и buildAll.
Что они делают думаю кристально понятно.
Далее примеры аннотирования
Вырезание класса:
Вырезание только методов:
Для вырезания директории целиком нужно завести в ней же файл
Иногда нужно вырезать только отдельную часть тела метода. Про это можно прочитать в репозитории в разделе инвокаторов и обсуждения в этой теме.
В дефолтной настройки вырезалки можно использовать класс-агрегатор
Валидация 2.1.0+
Во время сборки, после вырезания, но до упаковки в результирующий бинарник вырезалка будет проводить валидацию. Это значит, что она будет пытаться найти такие моменты когда вы дергаете клиентские классы из серверного кода или серверные из клиентского. Если она найдет такие случаи, она выведет их всех в консоль и выбросит исключение. Это значит, что в итоге бинарник она не соберет.
Чтобы отключить валидацию, нужно прописать
Также существует возможность отключить валидацию для класса/метода/поля при помощи аннотации. Это самая опасная штука валидации потому в стандартной конфигурации эта аннотация задана не будет. Если кому-то это все же будет действительно нужно, welcome разбираться тык
Инвокаторы 2.1.0+
Иногда возникает необходимость вырезать не весь метод, а только его часть. Для таких целей в вырезалеке есть класс
Клиентский код оборачивать в
Серверный код оборачивать в
Содержимое лямбд будет вырезано на соответствующих билдах.
Также иногда возникает необходимость вернуть значение из вот такой вот лямбды. Тут все тоже очень просто.
Клиентский код оборачивать в
Серверный код оборачивать в
Более подробно про инвокаторы можно прочитать в репозитории.
Эвристика 2.1.0+
Я уверен, что у многих в коде есть что-то типа
И в целом было бы удобно если бы такие куски кода вырезались бы без применения инвокаторов. И именно эту проблему решает эвристика. Она на базе используемых в if выражениях полях и методах делает предположения о том куда может зайти код, а куда не может.
Это все настраивается достаточно гибко, но в дефолтной конфигурации эвристика смотрит только на
Эвристика на данный момент фича экспериментальная, а как следствие дефолтная конфигурация не включает ее по дефолту.
Чтобы исправить эту ситуацию нужно написать
Немного про анализ
Вырезалка будет ожидать, что вы будете ставить аннотацию над классом, методом, полем или в package-info. Помимо очевидных эффектов (вырезание конкретно данной сущности) еще происходят следующие явления:
Еще пара слов про настройку
Тут просто хочу заметить, что вы можете изменять дефолтную конфигурацию не полностью. Это значит, что можно применить ее, а потом еще пару шагов(не все) применить отсюда
Заключение
Если после прочтения данной темы вы что-то не поняли, вы можете ознакомится с моим отвратительным видосиком для 1.7.10 тык
Peace!
Вырезалка это плагин для градла. Она нужна для автоматического вырезания клиентского кода из серверных билдов.
Разграничение серверного кода и клиентского происходит через аннотации.
Установка
Тут все стало значительно проще. Я все-таки обзавелся доменом в мавен централе и теперь применение снапшота выглядит вот так:
Gradle (Groovy):
buildscript {
repositories {
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
dependencies {
classpath 'tech.justagod:cutter:2.1.0-SNAPSHOT'
}
}
apply plugin: 'cutter'
Пример для 1.7.10
Java:
buildscript {
repositories {
mavenCentral()
maven {
name = "forge"
url = "https://files.minecraftforge.net/maven"
}
maven {
name = "maven"
url = "https://repo1.maven.org/maven2"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
dependencies {
classpath 'tech.justagod:cutter:2.1.0-SNAPSHOT'
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
}
}
apply plugin: 'cutter'
apply plugin: 'forge'
Gradle (Groovy):
buildscript {
repositories {
mavenCentral()
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
dependencies {
classpath 'tech.justagod:cutter:2.1.0-SNAPSHOT'
}
}
plugins {
id "net.minecraftforge.gradle.forge" version "2.0.2"
}
apply plugin: 'cutter'
Вырезалка довольно гибкий в настройке плагин, но мне сказали, что гибкость не нужна. Нужно что б все было просто.
Теперь настройка представляет из себя одну строку
cutter.initializeDefault(true, false)
1 true - включать ли дефолтную либу вырезалки в целевой жарник
2 false - включать ли эвристику (о ней позже)
Ее нужно сунуть где то в конец вашего build.gradle но до секции dependencies.
С более брутальной настройкой вы можете ознакомится в репозитории: Cutter
Примеры
Вырезалка добавит 3 таска: buildClient, buildServer и buildAll.
Что они делают думаю кристально понятно.
Далее примеры аннотирования
Вырезание класса:
Java:
package com.example.examplemod;
import net.minecraft.init.Blocks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import ru.justagod.cutter.*;
@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION)
@GradleSideOnly(GradleSide.SERVER)
public class ExampleMod
{
public static final String MODID = "examplemod";
public static final String VERSION = "1.0";
}
Вырезание только методов:
Java:
package com.example.examplemod;
import net.minecraft.init.Blocks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import ru.justagod.cutter.*;
@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION)
@GradleSideOnly(GradleSide.SERVER)
public class ExampleMod
{
public static final String MODID = "examplemod";
public static final String VERSION = "1.0";
@GradleSideOnly(GradleSide.SERVER)
public void server() {}
@GradleSideOnly(GradleSide.CLIENT)
public void client() {}
}
Для вырезания директории целиком нужно завести в ней же файл
package-info.java
и пихнуть туда вот такой код:
Java:
@GradleSideOnly(GradleSide.CLIENT)
package com.example;
import ru.justagod.cutter.*;
Иногда нужно вырезать только отдельную часть тела метода. Про это можно прочитать в репозитории в разделе инвокаторов и обсуждения в этой теме.
В дефолтной настройки вырезалки можно использовать класс-агрегатор
ru.justagod.cutter.invoke.Invoke
Валидация 2.1.0+
Во время сборки, после вырезания, но до упаковки в результирующий бинарник вырезалка будет проводить валидацию. Это значит, что она будет пытаться найти такие моменты когда вы дергаете клиентские классы из серверного кода или серверные из клиентского. Если она найдет такие случаи, она выведет их всех в консоль и выбросит исключение. Это значит, что в итоге бинарник она не соберет.
Чтобы отключить валидацию, нужно прописать
cutter.validation = false
. Я, конечно же, очень не советую так делать.Также существует возможность отключить валидацию для класса/метода/поля при помощи аннотации. Это самая опасная штука валидации потому в стандартной конфигурации эта аннотация задана не будет. Если кому-то это все же будет действительно нужно, welcome разбираться тык
Инвокаторы 2.1.0+
Иногда возникает необходимость вырезать не весь метод, а только его часть. Для таких целей в вырезалеке есть класс
ru.justagod.cutter.invoke.Invoke
.Клиентский код оборачивать в
Invoke.client(() -> clientCode())
. Серверный код оборачивать в
Invoke.server(() -> serverCode())
. Содержимое лямбд будет вырезано на соответствующих билдах.
Также иногда возникает необходимость вернуть значение из вот такой вот лямбды. Тут все тоже очень просто.
Клиентский код оборачивать в
Object a = Invoke.clientValue(() -> clientCode())
.Серверный код оборачивать в
Object a = Invoke.serverValue(() -> serverCode())
.clientValue
на сервере всегда будет возвращать null
вместо объектов и дефолтное значение вместо примитивов.Более подробно про инвокаторы можно прочитать в репозитории.
Эвристика 2.1.0+
Я уверен, что у многих в коде есть что-то типа
Java:
if (world.isRemote)
// client code
} else {
// server code
}
Это все настраивается достаточно гибко, но в дефолтной конфигурации эвристика смотрит только на
world.isRemote
, если кому то этого покажется мало, милости просим читать документацию в репо.Эвристика на данный момент фича экспериментальная, а как следствие дефолтная конфигурация не включает ее по дефолту.
Чтобы исправить эту ситуацию нужно написать
cutter.initializeDefault(true, true)
Немного про анализ
Вырезалка будет ожидать, что вы будете ставить аннотацию над классом, методом, полем или в package-info. Помимо очевидных эффектов (вырезание конкретно данной сущности) еще происходят следующие явления:
- Все наследники удаленного класса/интерфейса также будут вырезаны
- Все методы, переопределяющие удаленный метод, также будут удалены
- Все классы объявленные в удаленном классе или методе также будут удалены
- Методы, имплементящие тело лямбд в удаленных методах, также будут удалены
Еще пара слов про настройку
Тут просто хочу заметить, что вы можете изменять дефолтную конфигурацию не полностью. Это значит, что можно применить ее, а потом еще пару шагов(не все) применить отсюда
Заключение
Если после прочтения данной темы вы что-то не поняли, вы можете ознакомится с моим отвратительным видосиком для 1.7.10 тык
Peace!