Есть ли такая вещь, как "проект только для содержания/данных" в visual studio
У меня есть куча дополнительных файлов XML и XSLT, которые я хочу редактировать и управлять в visual studio.
Файлы не логически относятся к любому проекту кода в моем решении, поэтому, чтобы их аккуратно группировать, я создал проект dll "dummy" С# в visual studio и отключил его от сборки в сборках Debug/release).
Я задавался вопросом, был ли более приятный способ достичь того же результата (т.е. иметь все файлы, видимые в обозревателе решений). То, что я действительно хочу, - это проект типа визуальной студии "только контент", но такой вещи не существует (или я не выглядел достаточно сложно?).
Я играл с идеей добавления файлов в качестве элементов решения, но тогда им кажется сложнее управлять, потому что создание новой "папки элементов решения" фактически не создает папку на диске.
У кого-нибудь есть идеи?
Ответы
Ответ 1
Рабочий коллега придумал решение.
Он предложил вручную отредактировать проект, чтобы удалить DefaultTargets
из проекта (и удалить нагрузку на неиспользуемые свойства).
MSBuild жалуется, если в проекте нет целей, поэтому он добавил три пустые цели.
Окончательный проект выглядит примерно так:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{541463A7-7CFA-4F62-B839-6367178B16BD}</ProjectGuid>
</PropertyGroup>
<ItemGroup>
... files ...
</ItemGroup>
<ItemGroup>
... files ...
</ItemGroup>
<Target Name="Build"/>
<Target Name="Rebuild"/>
<Target Name="Clean"/>
</Project>
По общему признанию, это решение требует большей ворчания, что мне бы хотелось, но, похоже, я добился того, что было после этого: именно проект, который не пытается произвести какой-либо вывод сборки.
Ответ 2
Энди опубликовал ссылку с решением, которое в основном работало для меня; в основном удалите из файла проекта следующую строку:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
и добавьте следующие строки:
<Target Name="Build">
<Copy
SourceFiles="@(Content)"
DestinationFiles="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')" />
</Target>
<Target Name="Clean">
<Exec Command="rd /s /q $(OutputPath)" Condition="Exists($(OutputPath))" />
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build">
</Target>
Я также обнаружил, что отключение свойства Debug проекта "Включить процесс хостинга Visual Studio" (для каждой конфигурации) не позволило сгенерировать файл MyProject.vshost.exe.
Как Дэвид И. Макинтош указал в комментарий к этому ответу, если ваш проект является частью решения с несколькими проектами и любыми другими проектами используют тот же путь вывода, что и проект только для содержания, указанный выше Clean
target удалит все файлы в пути вывода, то есть вывод сборки других проектов, и, таким образом, будет только правильным, если проект только для содержания - это первый построенный проект (среди тех, кто использует один и тот же путь вывода сборки). Ниже приведена более безопасная и дружественная Clean
цель для этого сценария:
<Target Name="Clean">
<Delete Files="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>
Ответ 3
Visual Studio 2015 имеет тип проекта, называемый "Общий проект", который по сути является проектом только для содержания без каких-либо целей. Он указан в Visual С#, но он может использоваться для любых файлов.
![введите описание изображения здесь]()
Ответ 4
Затем попробуйте создать Blank solution
. Создайте Empty project
. Создайте файлы в соответствующих папках в папке решения. Из окна свойств используйте Show all files
, включите эти папки в проект. Нет лучшего решения, кроме этого. Надеюсь.
Ответ 5
Этот ответ является просто удобной консолидацией ответов, приведенных выше Крисом Фьютреллом и Кенни Эвиттом, а также небольшими изменениями в моих комментариях выше и более подробной информацией о том, как должно выглядеть/должно выглядеть объявление элементов контента
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{541463A7-7CFA-4F62-B839-6367178B16BD}</ProjectGuid>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == '64-bit|AnyCPU'">
<PlatformTarget>x64</PlatformTarget>
<OutputPath>..\builds\$(Configuration)\</OutputPath>
<IntermediateOutputPath>..\builds\$(Configuration)\Intermediate\YourProjectName\</IntermediateOutputPath>
</PropertyGroup>
<ItemGroup>
<Content Include="fileInProjectFolder.csv" />
<Content Include="SubDir\fileInSubdir.txt" />
<Content Include="..\actualSourceDirectoryOfFile\app.log.basic.config">
<Link>targetSubdirInOutputDir\app.log.basic.config</Link>
</Content>
<Content Include="..\actualSourceDirectoryOfFile\yetAnotherFile.config">
<Link>yetAnotherFile.config</Link>
</Content>
... more files ...
</ItemGroup>
<Target Name="Build">
<Copy
SourceFiles="@(Content)"
DestinationFiles="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')" />
</Target>
<Target Name="Clean">
<Delete Files="@(Content->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build">
</Target>
</Project>
Обратите внимание, что это всегда копирует все "контентные" файлы в выходной каталог - опции "Копировать, если новые", "Копировать всегда" и "Не копировать", как представлено в графическом интерфейсе визуальной студии (отображается как, для пример, <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
в файле .csproj) игнорируются.