автовырезалка

автовырезалка v03.4

Нет прав для скачивания
Максимально простой плагин для Gradle... был когда то
Настройка
Прежде чем приступить к установке, распакуйте содержимое архива в корень вашего проекта, затем в build.gradle корневого модуля пропишите apply plugin: ru.justagod.plugin.CutterPlugin.
Теперь в ваш проект должен был добавится новый блок конфигураций: cutter.
Пойдем, пожалуй, от сложного к простому. Так выглядит моя конфигурация:
Gradle (Groovy):
cutter {
    annotation = 'ru.justagod.mineplugin.GradleSideOnly'
    classesCache = file('cutter-cache')
    classesDirs = [compileJava.destinationDir]
    def clientSide = side('CLIENT')
    def serverSide = side('SERVER')
    builds {
        client {
            targetSides = [clientSide]
            primalSides = [clientSide, serverSide]
        }
        server {
            targetSides = [serverSide]
            primalSides = [clientSide, serverSide]
        }
    }
}
Где
annotation - имя вашей аннотации
classesCache - папка, куда будут копироваться классы перед обработкой. нужно чтобы не ломать инкрементальную компиляцию
classesDirs - папки с исходными классами. необходимо из-за того, что котлин, скала, груви и др. компилятся в разные папки. Но трушные джависты могут оставить все как у меня.

Дальше интересней. Я добавил возможность добавлять произвольные виды сторон, ибо на некоторых проектах, например, 3 стороны, а не 2(мун)

Так вот, ввожу 2 понятия: сторона и билд.
Здесь стоит отметить требования к аннотациям и сторонам.
Пример энума сторон:
Java:
@SuppressWarnings("unused")
public enum GradleSide {
    SERVER, CLIENT
}
Абсолютно не важно как называется ваша аннотация, главное имена энумов правильно указывайте в конфиге.
К сожалению, любые другие методы обозначения сторон кроме энумов я поддерживать не собираюсь, ибо смысла не вижу.
Дальше переходим к примеру аннотации:
Java:
public @interface GradleSideOnly {
    GradleSide[] value();
}
Вы можете как угодно менять название, главное обозначьте это в build.gradle
По части структуры, важный момент только в том, что параметр, отвечающий за сторону, должен называться value и иметь тип <enum name>[] или просто <enum name>. Остальное не важно.

Так вот, возвращаемся к настройке
Прежде чем настраивать билды, лучше всего настроить стороны:
Gradle (Groovy):
def clientSide = side('CLIENT')
def serverSide = side('SERVER')
Тут CLIENT и SERVER просто названия энумов. По факту, все равно что вы тут напишите, решают билды.

Билд характеризуется 2 свойствами:
targetSides - стороны, которые останутся после билда
primalSides - стороны, которые идут по-умолчанию. Чуть подробнее про вычисление сторон поговорим попозже.
Для обозначения билдов, я ввел контейнер 'builds'
Пример:
Gradle (Groovy):
 builds {
        client {
            targetSides = [clientSide]
            primalSides = [clientSide, serverSide]
        }
        server {
            targetSides = [serverSide]
            primalSides = [clientSide, serverSide]
        }
    }
Здесь я обозначил 2 билда, и думаю вполне понятно, что тут происходит.

Если вы все делали как я, у вас должно появится 2 таска: serverBuild и clientBuild.

Использование

Ну, по большому счету, в этой части ничего не изменилось. Лишь добавилось.
Спойлер: теперь классы могут вымирать(мун)
Чтобы обозначить на какой стороне должен находится класс, поле или метод достаточно написать над ним аннотацию, которую вы указали в конфиге.
Например:
Java:
public class Lol implements Server{

    @GradleSideOnly(GradleSide.SERVER)
    public String a;

    @Override
    @GradleSideOnly(GradleSide.CLIENT)
    public void kek() {
        Runnable a = () -> {
            Runnable b = new Runnable() {
                @Override
                public void run() {

                }
            };
        };
    }

    @GradleSideOnly(GradleSide.CLIENT)
    public static class Huy {

    }
}
Здесь поле 'a' будет существовать только на сервере, метод kek только на клиенте, как и класс Huy. Так же стоит заметить, что лямбда и анонимный класс внутри метода kek, так же будут вырезаны при серверном билде.
Дальше заметим еще одну деталь: класс Lol имплементит интерфейс Server, который выглядит вот так:
Java:
@GradleSideOnly(GradleSide.SERVER)
public interface Server {

    @GradleSideOnly(GradleSide.SERVER)
    public void kek();


}
То есть существует только на сервере, а значит и класс Lol будет существовать только на сервере. Но при этом у нас есть класс Huy, который является внутренним классом для Lol, а значит тоже серверный, но он помечен аннотацией с клиентской стороной. Так и выходит, что класс Huy никогда не попадет в жарник. F

Ну и в принципе осталось сказать только про то как вырезать директории. Тут все просто: заводите класс package-info в целевой директории, пишите в самом верху аннотацию с нужными сторонами. Например:

Java:
@GradleSideOnly(GradleSide.CLIENT)
package ru.justagod.test;

import ru.justagod.mineplugin.GradleSide;
import ru.justagod.mineplugin.GradleSideOnly;
Если вы все сделали верно, то после запуска одного из билдов вам должно вывестись примерно такое дерево:
Java:
root
+--ru
   +--justagod
      +--test
         +--Server SERVER
            +--kek() SERVER
         +--Lol SERVER
            +--field a SERVER
            +--kek() DEAD
            +--Huy DEAD
И в папке libs появится изрядно исхудавший жарник.

На этом вроде все
Если будут вопросы, то пишите в вк с пометочкой, что с форума(мун)

Автор
JustAGod
Скачивания
37
Просмотры
164
Первый выпуск
Обновление
Оценка
4.80 звёзд 5 оценок

Другие ресурсы пользователя JustAGod

Последние обновления

  1. Интересные штуки

    - Добавлена возможность вырезания отдельного кода в методах - Теперь методы наследуют стороны...
  2. Фиксы

    - Исправлен весьма критический баг, когда вырезалка не видела аннотацию - При билде вырезалки...
  3. Ивасикохотелки

    Пасаны, извините, что такие частые мелкообновы. Это все Ивасик виноват(мун) Вообщем то в этой...

Последние рецензии

Охуенно
Не хватает видео гайда, не понятно как и что делать.
5 звезд за проделанную работу) Результат пока не смотрел. Скорее всего будем юзать в LoD
Угу
JustAGod
JustAGod
Ага
Если бы такое у меня раньше было, я бы меньше мучался со своими костылями по разделению. Спасибо
Отличная штука! А почему юзается своя аннотация, а не SideOnly?
JustAGod
JustAGod
Я точно не помню, но кажется у меня был кейс, когда они были не совсем равноценны.
Сверху