Есть ли такая вещь, как "проект только для содержания/данных" в 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)%(E‌​xtension)')"/>
</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)%(E‌​xtension)')"/>
    </Target>
    <Target Name="Rebuild" DependsOnTargets="Clean;Build">
    </Target>
</Project>

Обратите внимание, что это всегда копирует все "контентные" файлы в выходной каталог - опции "Копировать, если новые", "Копировать всегда" и "Не копировать", как представлено в графическом интерфейсе визуальной студии (отображается как, для пример, <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> в файле .csproj) игнорируются.