Копировать в выходной каталог копирует структуру папок, но только хотите скопировать файлы


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

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

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

8 87

8 ответов:

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

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

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

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

добавление к тому, что @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" в основном создает новый именованный список, которому вы можете назначить элементы в проекте в разделе " сборка Действие " свойство в окне Свойства. Затем вы можете использовать этот вновь созданный список в любой целевой объект, который вам нравится (например, через "@(RootContent)").

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

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

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

Я считаю, что команда 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

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

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

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

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

  1. XML повторно используется в любом проекте
  2. "RootContent" выбирается в качестве действия сборки в пользовательском интерфейсе Visual Studio, как и любой другой "контент"
  3. "CopyToOutputDirectory" выполняется, как и следовало ожидать
  4. RootContent добавляется к выходу проекта: переносится через ссылки на проект, подчиняется "чистому" и т. д.
  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 .цели импорта:

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

Заимствовано Из Этого Ответа

Я закончил тем, что добавил шаг в файл сборки 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>

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