Копировать в выходной каталог копирует структуру папок, но только хотите скопировать файлы
у меня есть VS2008 я хочу скопировать определенные файлы из каталога в мой . Я установил файлы (расположенные в /common/browserhawk/
) в "копировать в выходной каталог". Однако он также копирует структуру папок: файлы копируются в /bin/common/browserhawk/
как мне получить эти файлы для копирования только /bin/
? Я не хочу хранить их в корне веб-сайта, чтобы заставить их правильно копировать.
связанный вопрос: Visual Studio добавляет .dll и .pdb для проецирования после компиляция
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. Я предпочитаю это решение, потому что:
- XML повторно используется в любом проекте
- "RootContent" выбирается в качестве действия сборки в пользовательском интерфейсе Visual Studio, как и любой другой "контент"
- "CopyToOutputDirectory" выполняется, как и следовало ожидать
- RootContent добавляется к выходу проекта: переносится через ссылки на проект, подчиняется "чистому" и т. д.
- 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>