У меня есть VS2008. Я хочу скопировать определенные файлы из каталога в свою /bin/
папку. Я установил файлы (расположенные в /common/browserhawk/
) на «Копировать в выходной каталог». Однако он также копирует структуру папок: файлы копируются в/bin/common/browserhawk/
Как мне сделать так, чтобы эти файлы можно было просто скопировать /bin/
? Я не хочу хранить их в корне веб-сайта, чтобы их можно было правильно скопировать.
Связанный вопрос: Visual Studio добавляет в проект .dll и .pdb после компиляции
visual-studio-2008
msbuild
Стив Райт
источник
источник
xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
Поскольку я не могу комментировать предыдущие ответы, я поставлю решение здесь:
В дополнение к тому, что предоставил @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)").
источник
AvailableItemName
на недопустимый элемент, если вы редактируете файл проекта в VS; просто игнорируйте предупреждение, оно все равно работает.<Target Name="RootOutputCopyTarget" AfterTargets="Build">
... </Target>Если вы редактируете .csproj / .vbproj в текстовом редакторе, вы можете контролировать, где файл будет помещен в выходной каталог, а также какое имя будет иметь файл в выходном каталоге. Например:
<None Include="content\someContent.txt"> <Link>someContentInOutputDirectory.txt</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None>
Это поместит файл
content\someContent.txt
в форматbin\someContentInOutputDirectory.txt
. Вы также можете выбрать подкаталог в,bin
если хотите; просто добавьте его в элемент Link.источник
Я считаю, что команда XCOPY лучше обрабатывает каталоги и файлы. Следовательно,
Это позволяет создавать папки вне целевого каталога.
Папка / файловая структура проекта:
Становится:
источник
/D
также может быть полезно, чтобы избежать перезаписи возможных изменений.Добавьте следующее в свой файл .csproj / .vbproj
<Target Name="AfterBuild"> <Copy DestinationFolder="$(OutputPath)" SourceFiles="@(RootContent)" SkipUnchangedFiles="true" /> </Target>
Затем измените действие сборки для любых файлов, которые вы хотите в корневой папке, на RootContent.
источник
RootContent
он не отображается в раскрывающемся списке «Действие при сборке», а ввод его вручную приводит к ошибке «Недопустимое значение свойства» из Visual Studio. Что я упустил?Я использовал это в VS2010, VS2015, VS2017 и VS2019. Я предпочитаю это решение, потому что:
К началу файла проекта:
<ItemGroup> <AvailableItemName Include="RootContent"> <!-- Add "RootContent" as a choice in the "Build Action" dropdown. --> <Visible>True</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>
Заимствовано из этого ответа
источник
RootContent
что подразумевает «жестко запрограммированный», чтобыCustomContent
указать, что это специализированный контент, который мы добавляем в этот проект и который нам нужно скопировать именно таким образом. Кроме того, мне нужноTargetPath=%(RecursiveDir)%(Filename)%(Extension)
было воссоздать структуру папок из указанныхCustomContent
файлов в выходной путь./common/browserhawk/
копировались в,/bin/common/browserhawk/
как сказал OP? IIRC, мое намерение состояло в том, чтобы/common/browserhawk/a.txt
закончить,/bin/a.txt
но разрешить рекурсию оттуда вниз, поэтому/common/browserhawk/secret/stuff.png
заканчивается/bin/secret/stuff.png
.%(RecursiveDirectory)
. Это действительно здорово, потому что помимо выбора отдельных файлов в среде IDE вы также можете указать несколько файлов с помощью подстановочных знаков. При использовании**
подстановочного знака вся структура папок будет сохранена.В итоге я добавил шаг в файл сборки 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>
источник
Вы можете создать командный файл, чтобы скопировать файлы и выполнить его как событие после сборки.
источник