Copy to Output Directory копирует структуру папок, но хочет копировать только файлы - PullRequest
87 голосов
/ 18 июня 2009

У меня VS2008. Я хочу скопировать определенные файлы из каталога в мою папку /bin/. Я установил файлы (расположенные в /common/browserhawk/) на «Копировать в выходной каталог». Однако он также копирует структуру папок: файлы копируются в /bin/common/browserhawk/

Как мне заставить эти файлы скопировать на /bin/? Я не хочу хранить их в корне сайта, чтобы они правильно копировались.

Смежный вопрос: Visual Studio добавляет .dll и .pdb в проект после компиляции

Ответы [ 8 ]

59 голосов
/ 24 июля 2010

Вы можете добавить событие Post Build для копирования файлов.
Перейдите в свойства проекта на вкладке «События сборки» и добавьте в командную строку события после сборки следующее:

copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"

Обязательно включайте кавычки, если в пути вашего проекта есть пробелы.

44 голосов
/ 01 декабря 2010

Поскольку я не могу комментировать предыдущие ответы, я выложу решение здесь:

В дополнение к предоставленному @PaulAlexander, добавьте следующее в ваш файл .csproj / .vbproj:

<ItemGroup>
    <AvailableItemName Include="RootContent">
      <Visible>false</Visible>
    </AvailableItemName>  
</ItemGroup>
<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

Это позволяет вам выбрать «RootContent» в качестве действия сборки в окне «Свойства», и все это можно получить через графический интерфейс. Более полное объяснение: опция «AvailableItemName» в основном создает новый именованный список, которому можно назначить элементы в проекте в свойстве «Build Action» в окне «Свойства». Затем вы можете использовать этот вновь созданный список в любой выбранной вами цели (например, через "@ (RootContent)").

43 голосов
/ 03 февраля 2014

Если вы редактируете .csproj / .vbproj в текстовом редакторе, вы можете контролировать, где файл будет размещен в выходном каталоге, а также какое имя будет иметь файл в выходном каталоге. Например:

<None Include="content\someContent.txt">
  <Link>someContentInOutputDirectory.txt</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

Это поместит файл content\someContent.txt в bin\someContentInOutputDirectory.txt. Вы также можете выбрать подкаталог в bin, если хотите; просто добавьте его в элемент Link.

15 голосов
/ 29 июля 2010

Я считаю, что команда XCOPY лучше обрабатывает каталоги и файлы. Следовательно,

    XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y

Позволяет создавать папки вне целевого каталога.

    XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y

Папка проекта / структура файла:

    A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt

становится:

    A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
    │   ConsoleApplication3.exe
    │   ConsoleApplication3.pdb
    │   ConsoleApplication3.vshost.exe
    │   ConsoleApplication3.vshost.exe.manifest
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    │
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt
10 голосов
/ 18 июня 2009

Добавьте следующее в ваш файл .csproj / .vbproj

<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

Затем измените действие сборки любых файлов в корневой папке на RootContent.

5 голосов
/ 12 марта 2015

Я использовал это в VS2010 и VS2015. Я предпочитаю это решение, потому что:

  1. XML можно использовать в любом проекте
  2. «RootContent» выбирается в качестве действия по сборке в пользовательском интерфейсе Visual Studio, как и любой другой «контент»
  3. «CopyToOutputDirectory» выполняется, как и следовало ожидать
  4. RootContent добавляется к выводу проекта: переносится через Project-References, подчиняется "Clean" и т. Д.
  5. RootContent может быть указан с подстановочным знаком, сохраняя рекурсивную структуру папок:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    

К началу файла проекта:

  <ItemGroup>
    <AvailableItemName Include="RootContent">
      <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
      <Visible>False</Visible>
    </AvailableItemName>
  </ItemGroup>

Заимствовано из этого ответа

После импорта Microsoft .targets:

  <PropertyGroup>
    <AssignTargetPathsDependsOn>
      $(AssignTargetPathsDependsOn);
      IncludeRootContentAsContent;
    </AssignTargetPathsDependsOn>
  </PropertyGroup>
  <Target Name="IncludeRootContentAsContent">
    <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>

Заимствовано из этого ответа

2 голосов
/ 18 июня 2009

В итоге я добавил шаг в файл сборки nant для копирования после успешного компиляции

<target name="action.copy.browserhawk.config" depends="compile.source">
    <copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
        <fileset basedir="${browserhawk.config.dir}">
            <include name="bhawk_bb.dat" />
            <include name="bhawk_sp.dat" />
            <include name="browserhawk.properties" />
            <include name="maindefs.bdd" />
            <include name="maindefs.bdf" />
            <include name="BH_PRO.lic" />
        </fileset>
    </copy>
    <echo message="COPY BROWSERHAWK CONFIG: SUCCESS   ${datetime::now()}" />
</target>
1 голос
/ 18 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...