Коли для copy-local слід встановити значення true, а коли ні?


76

Цікаво, чи існує якась евристика, коли встановлювати copy-local=trueдля посилань?

Якщо посилальні типи використовуються тільки внутрішньо я можу встановити copy-localна trueале якщо посилальні типи піддаються в якості параметрів або значень, що повертаються , які я поставив copy-localу falseі вказати , що конкретний варіант залежності слід посилатися , коли моя бібліотека повинна використовуватися?

Хтось може пояснити мені це?

Відповіді:


70

Локальне копіювання важливо для сценаріїв розгортання та інструментів. Як загальне правило, слід використовувати CopyLocal = True, якщо посилання не міститься в GAC.

Копіювати Local, по суті, означає, що я повинен вручну розгорнути цю DLL, щоб моя програма працювала. Коли воно хибне, це по суті означає "Я залежа від іншого компонента, який повинен бути встановлений окремо або прив'язаний, DLL просто там вже буде".


1
Як щодо випадку, коли у мене є утиліта бібліотеки MyUtils, яка використовує LibX (не в gac) всередині і не надає жодних типів LibX. Там я встановив для copy-local значення true. Якщо, однак, я виставляю типи LibX із MyUtils, мені доведеться переглянути. LibX, а також від ProjectA, який використовує MyUtils ні?
Fadeproof 02.03.09

Чи повинен я в такому випадку встановити для copy-local значення false, оскільки мені доведеться переглядати LibX, а також MyUtils від ProjectA?
Захист від затухання 02.03.09

21

Копіювати локально було реалізовано для підтримки локальної налагодження. Коли ви готуєте свою програму для пакетування та розгортання, ви повинні будувати свої проекти в одній папці виводу та переконуватися, що у вас є всі необхідні посилання.

CopyLocal особливо болить при побудові великих дерев-джерел. Виникло пов’язане запитання про те, як вимкнути CopyLocal тут на SO, ви можете побачити це на сторінці Як перевизначити налаштування CopyLocal (приватне) для посилань у .NET від MSBUILD . А також найкращі практики для великих рішень у Visual Studio (2008).

Про те, як боротися з побудовою великих дерев-джерел, я писав у статті MSBuild: Найкращі практики створення надійних збірок, частина 2 .

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


3
Чи було б краще сказати "вимкнути ТОЛЬКО CopyLocal, коли ви змінюєте вихідні дані для створення своїх проектів в одній папці виводу та переконайтесь, що у вас є всі потрібні посилання там."?
Michael Freidgeim

@MichaelFreidgeim: Ви знайшли відповідь на своє запитання?
Дейв Нью,

15

Це насправді стосується цільового середовища. Якщо copy local є хибним, ви говорите, що збірка вже існує у цільовому середовищі (зазвичай у GAC). Якщо встановити значення true, воно відображатиметься у вихідних даних вашої збірки, тому полегшить розгортання у цільовому середовищі.


8

Ознайомтеся з наступним посиланням MSDN, яке детально пояснює поведінку CopyLocal.

Посилання на проекти

На жаль, є деякі дивацтва, і CopyLocal не потребує роботи, як очікується, для посилань на збірки у вторинних збірках, структурованих, як показано нижче.

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll (якщо в GAC CopyLocal не копіює в папку кошика MainApp)

Це ускладнює розгортання xcopy, якщо ви не плануєте встановлювати сторонні збори в GAC на цільовій машині.


1
Оновив посилання, я б хотів, щоб Microsoft перенаправила їх після переміщення матеріалів.
jpierson

2

Цей параметр впливає лише на фазу збірки. Він просто копіює посилання на локальний каталог побудованої збірки.

Якщо інша збірка (T) хоче використовувати метод зі збірки, яку ви будуєте (A), яка має тип повернення або параметри з іншої згаданої збірки (R), вона (T) повинна мати доступ до цієї збірки (R). Це може бути в змозі зробити, не роблячи нічого особливого, якщо вказаний збірник (R) встановлений у GAC. В іншому випадку йому потрібна локальна копія цього.


3
Це робить трохи більше, ніж це. Це сильно впливає на сценарії розгортання.
ДжаредПар, 02.03.09

Я вважаю, що це не впливає на збірку, за винятком простого процесу копіювання файлів. Будь ласка, виправте мене, якщо це неправда.
mmx

@Mehrad, це вплине на сценарії збірки, але принаймні однаково спрямоване на розгортання.
ДжаредПар, 02.03.09

@JaredPar: Ну звичайно. Я не заперечував цього. Я думав, що це може бути щось особливе, зроблене в збірці, про що я не знав. Все одно, дякую.
mmx

1

Консервативний спосіб встановити CopyLocal false - це перевірити, чи посилання знаходиться у вихідному шляху проекту. Це має дозволити вам уникнути деяких неприємних проблем, пов'язаних із роботою, водночас зменшуючи кількість вводу-виводу.

У процесі я створив CopyLocalFixer , який можна запустити для папки. Я спробував це за допомогою однієї великої збірки, але результати були не настільки вражаючими, чесно кажучи. Я думаю, це зводиться до структури папок проекту.


0

Встановити CopyLocal = false покращить час збірки, але може спричинити різні проблеми під час розгортання.

Мій досвід налаштування CopyLocal = false не був успішним. Див. Короткий опис плюсів і мінусів у моєму дописі в блозі " НЕ змінюйте посилання на проект" Копіювати локально "на хибні, якщо не зрозуміти послідовності ."

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.