Копіювання файлів у папку програми під час компіляції


95

Якщо у мене є кілька файлів, які я хочу скопіювати зі свого проекту в .\bin\debug\папку під час компіляції, то, здається, я повинен помістити їх у корінь проекту. Поміщення їх у підпапку, здається, копіює їх у .\bin\debug\папку в тій самій структурі, в якій вони зберігаються.

Чи є спосіб уникнути цього?

Просто щоб бути ясно: якщо у мене є MyFirstConfigFile.txtі MySecondConfigFile.txtв ConfigFilesпапці , і я поставив їх копіювання на вихід бути Copy ... , потім вони з'являються в .\bin\debug\ConfigFiles\папці. Я хочу, щоб вони з’явилися в .\bin\debug\папці.

Відповіді:


93

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

Ось макрос збірки публікацій, який, на мою думку, буде працювати, копіюючи всі файли в каталозі під назвою Конфігурація в кореневу папку збірки:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)

1
Для призначення не повинно бути $ (ProjectDir) \% (OutDir)?
Ед Грівз,

11
Правильний і перевірений (Vs2010) макрос: копія "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Ерік Боле-Фейсот,

Ви також можете просто зробити відносний файл для виводу: скопіюйте "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Елендурвен,

3
Вважаю, що використання лапок необхідно:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
тедебус

1
У MSVS2017 (15.4) це просто повинно бути $(OutDir)(тобто без $(ProjectDir)), здається ... інакше ви отримуєте подвійні помилки шляху
JHBonarius

51

Ви можете використовувати завдання MSBuild на своєму csproj, наприклад.

Відредагуйте файл csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>

Це найкраще рішення, оскільки ви можете використовувати символи підстановки для копіювання багатьох файлів, і вони не повинні бути в проекті.
Кріс Бордеман

37

Ви також можете помістити файли або посилання в корінь провідника рішень, а потім встановити властивості файлів:

Build action = Content

і

Copy to Output Directory = Copy if newer (наприклад)

Для посилання перетягніть файл із провідника Windows у провідник рішень, утримуючи клавіші Shift та Control.

введіть тут опис зображення


3
Це збереже початковий відносний шлях, що не прийнятно для ОП
jlee

Якщо ви помістите файл у вузол верхнього рівня вашого проекту, він буде скопійований безпосередньо у вихідну папку $ (OutputPath).
Георг

4

Особисто я віддаю перевагу саме цьому шляху.

Змініть, .csprojщоб додати

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

1
На мій погляд, це краще, ніж подія подій після збірки. Дякую!
khlr

Хіба це не те саме, що клацнути правою кнопкою миші на проекті та вибрати "Додати | Існуючий елемент" у Провіднику рішень, а потім встановити для властивості Файл "Копіювати у вихідний каталог" значення "Копіювати, якщо новіше". Немає необхідності змінювати XML безпосередньо.
Ентоні Бут,

Через деякий час @AntonyBooth ви зрозумієте, що завжди легше зрозуміти, що відбувається, і змінити код безпосередньо, ніж навчитися робити те саме з вашою IDE. Сьогодні ви використовуєте Visual Studio, завтра це може бути JetBrains Rider, а післязавтра VS Code. Зрештою, вам завжди краще опанувати мову, а не IDE. PS: Я не знаю, чи те, що ви описуєте, є однаковим, оскільки я знаю лише, як це зробити в XML, набагато краще, як це.
Jérôme MEVEL

3

копіювати з підпапки в підпапку -

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"

7
Ласкаво просимо до StackOverflow та дякуємо за ваш внесок. Ви відповіли на справді старе запитання, яке вже має купу високо оцінених відповідей. Якщо ви вважаєте, що вашу відповідь корисно мати на додаток до існуючих схвалених відповідей, вам слід додати невелике пояснення, чому ваша відповідь вирішує проблему і чому вона краща / відрізняється від інших.
Matthijs Wessels

1

Ви хочете використовувати подію Post-Build для свого проекту. Ви можете вказати вихідні дані там, і є значення макросів для часто використовуваних речей, таких як шлях до проекту, назва елемента тощо.


0

Ви можете використовувати подію проекту PostBuild. Після завершення збірки ви можете запустити пакетний файл DOS і скопіювати потрібні файли у потрібну папку.


0

Я знайшов це питання, шукаючи "копіювати файли в папку програми під час компіляції". Здається, це вже відсортовано в OP, але якщо ви цього не зробите:

У Visual Studio клацніть файл правою кнопкою миші, виберіть властивості, а потім змініть параметр "скопіювати на вихід" на "завжди". Див. Http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


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