JetForcer

JetForcer

Приглашаю всех к обсуждению вопросов связанных с JetForcer (плагином IntelijIDEA для Salesforce разработки)

https://jetforcer.com/

дубликат сообщения из общей ветки https://salesforce-developer.ru/forum/topic-ischu-novuu-ide

> Работа со статик ресурсами. Насколько я понял при создании бандла он появляется он(папка) появляется на месте самого статик ресурса (с таким же именем как сам статик ресурс).

Да, именно так.

> Но вот не нашел как вернуть его обратно.

Такое действие сейчас не поддерживается (не реализовано). Очевидно можно добиться возврата запакованного ресурса вручную (запощу нужные шаги чуть позже),
но также очевидно, что сейчас это будет слишком сложно для повседневной работы.

> К тому же такой интересный момент - как эти изменения будут отображаться на Git репозиторий?

Я предполагал, что для работы с Git удобнее хранить в репозитории уже распакованные бандлы, чтобы отслеживать изменения в отдельных файлах внутри бандла
(как вот описывает Maxim Elets).

Что касается совместимости:

1) совместимость IC (или другая IDE с 'внешней' папкой для распаковки) -> JF сейчас существует: при открытии (импорте) IC-проекта, JF просто проигнорирует внешнюю папку
и воспримет бандл как запакованный (из его стандартной локации). Для дальнейшей работы с содержимым бандла в JF его надо будет только распаковать через соответствующую акцию.
2) обратная совместимость JF -> IC здесь сейчас скорее отсутствует - я не ожидаю, что IC поймет проект, в котором бандл распакован в стандартной локации.
Поэтому в Git-репозитории, из которого работают не только в JF, стоит хранить бандлы в запакованном виде.

В целом я бы предложил следующие улучшения:

1) явную акцию упаковки выбранного бандла (как очевидное улучшение) - открыл на это https://youtrack.jetforcer.com/issue/JF-1170
2) выполнять (опционально) автоматическую упаковку всех бандлов в проекте при переключении ApexVCS -> Git (и обратную распаковку при переключении Git -> ApexVCS)
Для тех кому удобнее тракать в Git-репе распакованные бандлы, эта опция будет отключена.
Для тех же, кому важнее совместимость Git-репы с другими IDE, эта опция будет включена.
- открыл на это https://youtrack.jetforcer.com/issue/JF-1171.
Выполнение автоматической упаковки очевидно увеличит время выполнения переключения ApexVCS <-> Git,
но кажется, что упаковку нужно выполнять все равно, а момент переключения VCS для этого больше всего подходит.

Отдельно отмечу, что распаковки во 'внешней' папке хотелось бы избежать, чтобы не дублировать состояние бандла.
Также текущее поведение JF соответствует поведению SFDX, который оперирует распакованными бандлами прямо в их стандартной локации.

Комментарии по улучшениям welcome. Также Вы можете голосовать за иссьи прямо в youtrack.jetforcer.com, это будет влиять на приоритет их реализации.

дубликат сообщения из общей ветки https://salesforce-developer.ru/forum/topic-ischu-novuu-ide

Шаги workaround для обратной запаковки expanded resource bundle в JF:

0) есть распакованный бандл (папка) <projectRoot>/unpackaged/staticresources/mybundle.resource
1) задеплоить все изменения в бандле в орг
2) вне (!) IDE - например через Windows Explorer - удалить собственно папку ресурса <projectRoot>/unpackaged/staticresources/mybundle.resource
и соответствующий файл <projectRoot>/unpackaged/staticresources/mybundle.resource-meta.xml
3) также вне (!) IDE удалить папку и файл состояния из ApexVCS - <projectRoot>/.apex/staticresources/mybundle.resource + <projectRoot>/.apex/staticresources/mybundle.resource-meta.xml
4) выкачать бандл в орг заново - через акцию main menu -> Salesforce -> Retrieve Project -> выбрать mybundle под нодом StaticResource

Эх ребята, подкупили вы меня своим задором и целеустремленностью.
А так же раз мне выпал отличный шанс и свободное время (сегодня последний рабочий день с основным клиентов и можно со спокойной душей попрощаться с текущими проектами в ММ и IC), переключусь на JF как основную IDE.
Понравились ваша скорость развития и быстрая обратная связь.
Да, многое показалось сначала непривычным, но обсудив эти моменты здесь понял что в этих необычностях что-то есть. Ну и то что вы идете навстречу и охотно допиливаете свой продукт это круто!
Надеюсь мой опыт пригодиться вам чтобы сделать JF еще лучше!!! Обещаю активно отписываться о своих впечатлениях

Cколько стоит это дело ?

https://jetforcer.com/buy

Dmitry Shnyrev
https://jetforcer.com/buy
не работает ссылка

не знаю, в хроме отлично работает.

у них походу сайт лежит хорошая реклама.

Не думаю
5 человек на обрушат сайт

попробуй с другого браузера или девайса

Sergey Prishchepa
Cколько стоит это дело ?

Кстати, существует партнерская программа. За активное участие в развитии продукта могут дать бесплатную лицензию. Так что можешь попробовать помочь с развитием проекта, попробовать триальную версию и выдать свой вердикт. Если отзывы будут по делу, то есть шанс сэкономить на лицензии

Тем самым убъешь 2-х зайцев. И инструмент получишь в распоряжение, которые по заверениям авторов уже превосходит по функционалу IC, и бабки съэкономишь!

Вышла 1.2 версия, в ней много плюшек 😊

https://plugins.jetbrains.com/plugin/9238--jetforcer-plugin-for-handy-force-com-development-with-jetbrains-ides/update/42004

Sergey Prishchepa
у них походу сайт лежит хорошая реклама.

Ничего не ломается только у тех, кто ничего не делает😊

Michael
Вышла 1.2 версия, в ней много плюшек 😊

Отличная новость!!!
Вот сейчас праздники закончатся буду пробовать!!!

1 - А что по лицензиям??
Personal - 59$ (в год, месяц, день, 1 раз на всю жизнь)?
Commercial - 99$ (в год, месяц, день, 1 раз на всю жизнь), на сколько человеков?

2 - Есть ли разница между P и С в плане саппорта и тд?

3 - Сколько дней на триал? (30)

И возможны ли какие конфликты если поставить этот плагин в догонку IC?

Cyclic dependency: [class com.dci.intellij.dbn.options.DefaultProjectSettingsManager, class com.dci.intellij.dbn.options.DefaultProjectSettingsManager, class com.dci.intellij.dbn.options.ProjectSettings]

----------------------------------
Cyclic dependency: [class com.dci.intellij.dbn.options.DefaultProjectSettingsManager, class com.dci.intellij.dbn.options.DefaultProjectSettingsManager, class com.dci.intellij.dbn.options.ProjectSettings]

org.picocontainer.defaults.CyclicDependencyException: Cyclic dependency: [class com.dci.intellij.dbn.options.DefaultProjectSettingsManager, class com.dci.intellij.dbn.options.DefaultProjectSettingsManager, class com.dci.intellij.dbn.options.ProjectSettings]
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.instantiateGuarded(CachingConstructorInjectionComponentAdapter.java:75)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.getComponentInstance(CachingConstructorInjectionComponentAdapter.java:63)
at com.intellij.openapi.components.impl.ServiceManagerImpl$MyComponentAdapter.getComponentInstance(ServiceManagerImpl.java:220)
at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:239)
at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:206)
at com.intellij.openapi.components.ServiceManager.doGetService(ServiceManager.java:49)
at com.intellij.openapi.components.ServiceManager.getService(ServiceManager.java:43)
at com.dci.intellij.dbn.options.DefaultProjectSettingsManager.getInstance(DefaultProjectSettingsManager.java:23)
at com.dci.intellij.dbn.options.ProjectSettingsManager.getSettings(ProjectSettingsManager.java:52)
at com.dci.intellij.dbn.options.ProjectSettings.<init>(ProjectSettings.java:67)
at com.dci.intellij.dbn.options.DefaultProjectSettingsManager.<init>(DefaultProjectSettingsManager.java:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.picocontainer.defaults.InstantiatingComponentAdapter.newInstance(InstantiatingComponentAdapter.java:193)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.doGetComponentInstance(CachingConstructorInjectionComponentAdapter.java:103)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.instantiateGuarded(CachingConstructorInjectionComponentAdapter.java:80)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.getComponentInstance(CachingConstructorInjectionComponentAdapter.java:63)
at com.intellij.openapi.components.impl.ServiceManagerImpl$MyComponentAdapter.getComponentInstance(ServiceManagerImpl.java:220)
at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:239)
at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:206)
at com.intellij.openapi.components.ServiceManager.doGetService(ServiceManager.java:49)
at com.intellij.openapi.components.ServiceManager.getService(ServiceManager.java:43)
at com.dci.intellij.dbn.options.DefaultProjectSettingsManager.getInstance(DefaultProjectSettingsManager.java:23)
at com.dci.intellij.dbn.options.ProjectSettingsManager.getSettings(ProjectSettingsManager.java:52)
at com.dci.intellij.dbn.options.ProjectSettings.<init>(ProjectSettings.java:67)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.picocontainer.defaults.InstantiatingComponentAdapter.newInstance(InstantiatingComponentAdapter.java:193)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.doGetComponentInstance(CachingConstructorInjectionComponentAdapter.java:103)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.instantiateGuarded(CachingConstructorInjectionComponentAdapter.java:80)
at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.getComponentInstance(CachingConstructorInjectionComponentAdapter.java:63)
at com.intellij.openapi.extensions.AbstractExtensionPointBean.instantiate(AbstractExtensionPointBean.java:75)
at com.intellij.openapi.options.ConfigurableEP$ClassProducer.createElement(ConfigurableEP.java:341)
at com.intellij.openapi.options.ConfigurableEP.createConfigurable(ConfigurableEP.java:267)
at com.intellij.openapi.options.ex.ConfigurableWrapper.createConfigurable(ConfigurableWrapper.java:58)
at com.intellij.openapi.options.ex.ConfigurableWrapper.getConfigurable(ConfigurableWrapper.java:117)
at com.intellij.openapi.options.ex.ConfigurableWrapper.cast(ConfigurableWrapper.java:98)
at com.intellij.openapi.options.ex.ConfigurableWrapper.getId(ConfigurableWrapper.java:194)
at com.intellij.openapi.options.ex.ConfigurableExtensionPointUtil.groupConfigurables(ConfigurableExtensionPointUtil.java:278)
at com.intellij.openapi.options.ex.ConfigurableExtensionPointUtil.getConfigurableGroup(ConfigurableExtensionPointUtil.java:148)
at com.intellij.openapi.options.ex.ConfigurableExtensionPointUtil.getConfigurableGroup(ConfigurableExtensionPointUtil.java:139)
at com.intellij.ide.actions.ShowSettingsUtilImpl.getConfigurableGroups(ShowSettingsUtilImpl.java:67)
at com.intellij.ide.actions.ShowSettingsAction.perform(ShowSettingsAction.java:63)
at com.intellij.ide.actions.ShowSettingsAction.actionPerformed(ShowSettingsAction.java:52)
at com.intellij.openapi.wm.impl.welcomeScreen.FlatWelcomeFrame$FlatWelcomeScreen$IconsFreeActionGroup$1.actionPerformed(FlatWelcomeFrame.java:705)
at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:220)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:237)
at com.intellij.ui.popup.PopupFactoryImpl$ActionPopupStep.performAction(PopupFactoryImpl.java:966)
at com.intellij.ui.popup.PopupFactoryImpl$ActionPopupStep.performAction(PopupFactoryImpl.java:956)
at com.intellij.ui.popup.PopupFactoryImpl$ActionPopupStep.lambda$onChosen$0(PopupFactoryImpl.java:950)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:195)
at com.intellij.ui.popup.AbstractPopup.lambda$null$7(AbstractPopup.java:1431)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:762)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:732)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:822)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:650)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:366)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

я просто поставил его вторым после IC
IntelijIdea CE 2017.3.2

UPD: валится если открыть Preferences

я правильно понял что сейчас для ресурсов нельзя указать внешнюю папку?
то есть чтобы ресурсы распаковывались и запаковывались из папки resourses-uasya которая лежит в одном уровне с папкой src ?

Насколько я понял из сообщений в другой ветке нельзя ставить 2 плагина одновременно. Один должен быть минимум деактивирован.
Но я советую поставить WebStorm и поставить отдельно на него JetForcer.
У меня так стояло - IDEA Ultimate + IC и WebStorm + JF.

Удалил IC, поставил JF.

DB Navigator - New Plugin Version Available: A newer version of Database Navigator plugin is available in repository. Error report not sent.

null

java.lang.NullPointerException
at com.dci.intellij.dbn.common.about.ui.AboutComponent.<init>(AboutComponent.java:81)
at com.dci.intellij.dbn.menu.action.OpenAboutPageAction.actionPerformed(OpenAboutPageAction.java:14)
at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:220)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:237)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:321)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:911)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:136)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:311)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:130)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:88)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:111)
at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:120)
at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:122)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:130)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at com.apple.laf.ScreenMenuItemCheckbox.itemStateChanged(ScreenMenuItemCheckbox.java:193)
at java.awt.CheckboxMenuItem.processItemEvent(CheckboxMenuItem.java:389)
at java.awt.CheckboxMenuItem.processEvent(CheckboxMenuItem.java:357)
at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:355)
at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:343)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:767)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:737)
at java.awt.EventQueue$4.run(EventQueue.java:735)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:822)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:650)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:366)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

У меня по ходу тоже в WebStorm ошибка от JetForcer прилетела

https://snag.gy/yLz5Mc.jpg
https://snag.gy/8lZt3E.jpg

Мне кажется, эти проблемы легко чинятся. Стоит их засабмитить вместе со стектрейсом из idea.log в https://youtrack.jetforcer.com/issues, там их бытсрее увидят и починят.

1 - А что по лицензиям??
Personal - 59$ (в год, месяц, день, 1 раз на всю жизнь)?

"1 раз на всю жизнь", т.е. "perpetual"

Commercial - 99$ (в год, месяц, день, 1 раз на всю жизнь),

аналогично - "1 раз на всю жизнь", т.е. "perpetual"

на сколько человеков?

грубо говоря - на 1 человека, если точнее - можно купить например 10 лицензий, поставить их на 100 машин, но одновременно пользоваться не больше чем 10ю, т.е. ограничение коммерческой лицензии на кол-во одновременно работающих юзеров

2 - Есть ли разница между P и С в плане саппорта и тд?

нет

3 - Сколько дней на триал? (30)

30 дней на первый триал, начиная с версии 1.2 добавлен "повторный триал" - при выходе каждой новой версии можно обновиться и попробовать еще 14 дней

Maxim Elets
я правильно понял что сейчас для ресурсов нельзя указать внешнюю папку?
то есть чтобы ресурсы распаковывались и запаковывались из папки resourses-uasya которая лежит в одном уровне с папкой src ?

Да, для ресурсов нельзя указать внешнюю папку. Собственно хотелось бы этого избежать и в будущем.

Svyatoslav Kovalsky
Собственно хотелось бы этого избежать и в будущем.

Лучше все-таки не избегать.
Есть много проектов заточенных под структуру того же MM. Они уже лежат в репозиториях.
Хотелось бы иметь src папку в проекте максимально чистой и соответствующей Salesforce Migration Tools (Ant).
Вот типичный случай. Папка src хранится в репозитории и используется разными тулами одинаково. Та же папка src должна спокойно перевариваться антом или любой IDE. В ММ с этим проблем нет.

Сорри, типичный случай не расскрыл пока пытался сформулировать идею.
Типичный случай - есть ант, и куча автоматизированных сктиптов.
Это все дело лежит в репозитории.
Берется ММ, создается пустой проект и папка src просто заменяется на ту что в репозитории.
Продолжаем работать.
Тоесть разрабы использую среду разработки поверх src, тот же CI использует src папку в своих черных делах (через ант)

Dmitry Shnyrev
Svyatoslav Kovalsky
Собственно хотелось бы этого избежать и в будущем.

Лучше все-таки не избегать.
Есть много проектов заточенных под структуру того же MM. Они уже лежат в репозиториях.
Хотелось бы иметь src папку в проекте максимально чистой и соответствующей Salesforce Migration Tools (Ant).
Вот типичный случай. Папка src хранится в репозитории и используется разными тулами одинаково. Та же папка src должна спокойно перевариваться антом или любой IDE. В ММ с этим проблем нет.

люто плюсую :)

Ну или было бы просто гуд иметь возможность запаковать ресурс со сторонней папки, потому что не знаю как у остальных, но у меня работа с ресурсами последнее время сводится к тому, чтобы поправить что-то в исходниках и сделать Deploy To Server(то есть просто собрать zip и залить). Не помню когда последний раз приходилось делать unzip ресурса

Маленький фидбек:
Работа с ресурсами неудобна
Файлы сохраняет по сравнению с ММ и IC просто ВЕЧНОСТЬ!!!!;
Постоянно пытается сначала рефрешнуть файл с орга, а потом проверить на конфликты, приходится вечно кликать на Cancel - совершенно неудобно. Может есть где галка чтобы отключить чек конфликтов?

Всем спасибо - остаюсь на ММ пока он не перестанет работать.

Может есть где галка чтобы отключить чек конфликтов?

Да, там вообще если конфликтов не обнаружено нотификация выскакивет что можно отключить проверку.
Ну либо ручками в настройках поменять галочку:

Interesting information? Help us, post link to social media..