Как предотвратить сборку Visual Studio 2017 от дублирования файлов содержимого в выходном каталоге при сборке? - PullRequest
0 голосов
/ 27 ноября 2018

Моя цель - предотвратить дублирование при сохранении желаемого макета.

Итак, у меня есть проект ( C # /. Net462 / VS15-2017 ), который ссылается на некоторые сторонние библиотеки DLL.По причинам я решил, что лучше всего упаковать эти файлы вместе с моим приложением и ссылаться на файлы в app.config, используя директивы.

Для более причин Iрешил поместить эти сборки (файлы .dll) в мой проект как контент , который копирует, когда новее .

Макет проекта выглядит примерно так, как показано ниже:

SexyApp                                  <-project
   References
       third.party.dll
   Images                                <-fluff
       sexy.png
   Lib                                   <-folder
       x86Arch                           <-folder
          third.party.dll                <-third party assembly (content, copy when newer)
          ru                             <-localized folder
             third.party.resource.dll    <-resource assembly (content, copy when newer)
   app.config
   sexy.cs

Выход разблокировки выглядит примерно так

bin
   Release
      sexy.exe
      sexy.config
      Images
         sexy.png
      third.party.dll                     <-This seems like a duplicate
      ru                                  <-This seems like a duplicate
         third.party.resource.dll         <-This seems like a duplicate
      Lib                                 <-This is what I want
         x86Arch                          <-This is what I want
            third.party.dll               <-This is what I want
            ru                            <-This is what I want
               third.party.resource.dll   <-This is what I want

Требуемый вывод

bin
   Release
      sexy.exe
      sexy.config
      Images
         sexy.png
      Lib                                    <-This is what I want
         x86Arch                             <-This is what I want
            third.party.dll                  <-This is what I want
            ru                               <-This is what I want
               third.party.resource.dll      <-This is what I want

То, что я пробовал

  • Создать действие нет, копировать, когда новее.По-прежнему дублирует файлы.
  • Создайте содержимое действия, не копируйте.Копирует их в неправильное местоположение.
  • В ссылках на DLL для локального копирования задано значение true.Установка значения false не изменила результат.

Редактировать: Путь сборки просто 'bin \ Release \' Ссылка на x86 была папкой ... x86 версиясторонние сборки.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я думаю, что вы пытаетесь решить не ту проблему.

То, что у вас есть, это борьба со стандартным поведением msbuild, а также добавление ненужной сложности в ваше приложение.

Все, что угодноПри помещении в подпапку в файле конфигурации должна быть соответствующая запись пути пробника.Вы должны будете это поддерживать, поэтому любые изменения, добавляемые в другие папки, будут иметь дополнительные накладные расходы на обслуживание.Это будет препятствовать автоматическому тестированию модульных и интеграционных тестов.

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

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

Возьмите ее у того, ктотолько что сделал противоположное тому, что вы пытаетесь сделать из-за всех проблем, которые это вызвало.

0 голосов
/ 01 декабря 2018

В файле проекта будет ссылка на третий файл.party.dll, а также запись для него.Ввод содержимого - это то, что копирует его в нужный вам подкаталог.В VS установите для него «copy local false» или отредактируйте файл проекта в блокноте и установите false для справки.

<Content Include="third.party.dll">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Reference Include="third.party.dll">
  <Private>false</Private>
</Reference>

Даже если вы говорите, что пытались установить для локальной копии значение false, я знаю, что это будет выполнено.В любом случае, файл, который будет проходить, предлагает мне: у вас есть еще один компонент, который ссылается на "third.party.dll", и он настроен на локальное копирование, поэтому он выведет "third.party.dll" в корень выводакаталог для вас.

Кстати, вы боретесь с поведением по умолчанию как msbuild, так и .net, помещая сторонние сборки в подпапку.Вашему приложению потребуется файл конфигурации с заданными путями, которые вам нужно будет поддерживать, иначе он не будет работать.Затем, если кто-то еще добавит компонент, который зависит от "third.party.dll", вы вернетесь к исходной точке, пытаясь извлечь его из папки bin.Если у вас нет веских причин использовать подпапки, не используйте их - это головная боль, без которой вы можете жить.

...