Когда должен локальный для копии иметь значение true и когда должен он нет?

Вот пример использования контроллера, введенного Guice.

/**
 * Loads a FXML file and injects its controller from the given Guice {@code Provider}
 */
public abstract class GuiceFxmlLoader {

   public GuiceFxmlLoader(Stage stage, Provider<?> provider) {
      mStage = Objects.requireNonNull(stage);
      mProvider = Objects.requireNonNull(provider);
   }

   /**
    * @return the FXML file name
    */
   public abstract String getFileName();

   /**
    * Load FXML, set its controller with given {@code Provider}, and add it to {@code Stage}.
    */
   public void loadView() {
      try {
         FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource(getFileName()));
         loader.setControllerFactory(p -> mProvider.get());
         Node view = loader.load();
         setViewInStage(view);
      }
      catch (IOException ex) {
         LOGGER.error("Failed to load FXML: " + getFileName(), ex);
      }
   }

   private void setViewInStage(Node view) {
      BorderPane pane = (BorderPane)mStage.getScene().getRoot();
      pane.setCenter(view);
   }

   private static final Logger LOGGER = Logger.getLogger(GuiceFxmlLoader.class);

   private final Stage mStage;
   private final Provider<?> mProvider;
}

Вот конкретная реализация загрузчика:

public class ConcreteViewLoader extends GuiceFxmlLoader {

   @Inject
   public ConcreteViewLoader(Stage stage, Provider<MyController> provider) {
      super(stage, provider);
   }

   @Override
   public String getFileName() {
      return "my_view.fxml";
   }
}

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

69
задан Ryu 3 May 2009 в 01:47
поделиться

5 ответов

Эта опция только влияет на фазу разработки. Это просто копирует ссылку на локальный каталог созданного блока.

, Если другой блок (T) хочет использовать метод от блока, Вы создаете (A), который имеет тип возврата или параметры от другого блока, на который ссылаются (R), он (T) должен быть в состоянии получить доступ к тому блоку (R). Это могло бы быть в состоянии сделать так, не делая ничего специального, если блок, на который ссылаются (R) установлен в GAC. Иначе этому нужна локальная копия этого.

2
ответ дан Mehrdad Afshari 7 November 2019 в 09:53
поделиться

Локальная копия важна для сценариев развертывания и инструментов. Как правило необходимо использовать CopyLocal=True, если ссылка не содержится в GAC.

Копия, Локальная по существу, означает, что я должен вручную развернуть этот DLL для своего рвения. Когда это - ложь, это по существу означает, что "Я завишу от другого компонента, который должен быть установлен отдельно или объединен в цепочку, DLL уже просто будет там".

61
ответ дан JaredPar 24 November 2019 в 13:53
поделиться

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

13
ответ дан Dan J 24 November 2019 в 13:53
поделиться

Ознакомьтесь со следующей ссылкой MSDN, в которой подробно объясняется поведение CopyLocal.

Ссылки на проекты

К сожалению, есть некоторые особенности, и CopyLocal не обязательно будет работать должным образом для ссылок на сборки во вторичных сборках, структурированных, как показано ниже.

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll (если в GAC CopyLocal не копирует в папку bin MainApp)

Это затрудняет развертывание xcopy, если вы не планируете устанавливать стороннюю сборку в GAC на целевой машине.

6
ответ дан 24 November 2019 в 13:53
поделиться

Локальная копия была реализована действительно для поддержки локальной отладки. Когда вы сравниваете ваше приложение с пакетом и установкой, вы должны собрать ваши проекты в одну и ту же выходную папку и удостовериться, что у вас есть все необходимые там ссылки.

CopyLocal особенно болезненно при построении больших деревьев исходников. Был связанный с этим вопрос о том, как отключить CopyLocal здесь, на SO, вы можете посмотреть на странице Как переопределить настройки CopyLocal (Private) для ссылок в .NET из MSBUILD. А также Лучшие практики для больших решений в Visual Studio (2008).

О том, как работать со построением больших деревьев исходных текстов, я написал в статье MSBuild: Best Practices For Creating Reliable Builds, Part 2 .

Короче говоря, я бы сказал, отключить CopyLocal, когда копирование файла приводит к тому, что ваши сборки занимают больше времени, чем вы готовы потратить на каждую сборку.

21
ответ дан 24 November 2019 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: