Создание проекта VS 2010 с только файлами содержимого - PullRequest
1 голос
/ 27 апреля 2010

У меня есть несколько файлов содержимого, которые я хотел бы передать нескольким проектам в Visual Studio.

Я поместил эти файлы в их собственный проект, установил для действия сборки значение «Содержимое», а для копии в выходной каталог - «Копировать, если новее». Я хотел бы, чтобы все эти файлы были скопированы в каталог bin / debug проектов, которые ссылаются на них.

Я могу заставить его работать, включив ссылку на проект «содержание» в каждый из проектов, которым нужны файлы, но для которых требуется генерировать минимальную сборку (3 КБ). Я предполагаю, что есть способ, с помощью MSBuild, заставить все это работать без создания пустой сборки?

Ответы [ 4 ]

4 голосов
/ 29 апреля 2010

Спасибо всем, кто нашел время, чтобы сделать предложение о том, как решить эту проблему.

Оказывается, что если я хочу, чтобы мои скомпилированные файлы содержимого обрабатывались как файлы содержимого (поскольку они копируются в выходной каталог любого другого проекта, который ссылается на мой проект), мне нужно создать цель, которая выполняется до GetCopyToOutputDirectoryItems и добавьте полный путь к файлам скомпилированного содержимого в группу элементов AllItemsFullPathWithTargetPath. MSBuild вызывает GetCopyToOutputDirectoryItems для проектов, от которых зависит текущий проект, и использует результирующий список файлов для определения файлов, которые копируются вместе с assembly.dll. Вот XML из моего .csproj, на случай, если у кого-то еще есть подобная проблема.

У меня есть пользовательская задача под названием "ZipDictionary", и я накапливаю все файлы, которые собираюсь скомпилировать, в ItemGroup под названием DictionaryCompile. Моя цель «FixGetCopyToOutputDirectoryItems» выполняется перед «GetCopyToOutputDirectoryItems». Я не делаю там фактической компиляции, так как эта цель может вызываться несколько раз, ссылаясь на проекты, и это ухудшит производительность. Цель выполняет некоторые преобразования, чтобы получить имена файлов после компиляции, а затем возвращает полные пути ко всем файлам, поскольку относительные пути не будут работать при вызове copy из ссылочного проекта.

<ItemGroup>
  <DictionaryCompile Include="Dictionaries\it-IT.dic">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </DictionaryCompile>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<UsingTask TaskName="ZipDictionary" AssemblyFile="..\LogicTree.DictionaryCompiler\bin\Debug\LogicTree.DictionaryCompiler.dll"/>
<Target Name="BeforeCompile">
  <Message Text="Files @(DictionaryCompile)" Importance="high" />
  <ZipDictionary DictionaryFiles="@(DictionaryCompile)" OutputDirectory="$(OutputPath)">
    <Output TaskParameter="OutputFiles" ItemName="DictionaryOutputFiles" />
  </ZipDictionary>
</Target>
<Target Name="FixGetCopyToOutputDirectoryItems" BeforeTargets="GetCopyToOutputDirectoryItems">
  <ItemGroup>
    <_DictionaryCompile Include="@(DictionaryCompile->'$(OutputPath)Dictionaries\%(FileName).ltdic')" />
  </ItemGroup>
  <AssignTargetPath Files="@(_DictionaryCompile)" RootFolder="$(MSBuildProjectDirectory)\$(OutputPath)">
    <Output TaskParameter="AssignedFiles" ItemName="_DictionaryCompileWithTargetPath" />
  </AssignTargetPath>
  <ItemGroup>
    <AllItemsFullPathWithTargetPath Include="@(_DictionaryCompileWithTargetPath->'%(FullPath)')" Condition="'%(_DictionaryCompileWithTargetPath.CopyToOutputDirectory)'=='Always' or '%(_DictionaryCompileWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'" />
    <_SourceItemsToCopyToOutputDirectoryAlways Include="@(_DictionaryCompileWithTargetPath->'%(FullPath)')" Condition="'%(_DictionaryCompileWithTargetPath.CopyToOutputDirectory)'=='Always'" />
    <_SourceItemsToCopyToOutputDirectory Include="@(_DictionaryCompileWithTargetPath->'%(FullPath)')" Condition="'%(_DictionaryCompileWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'" />
  </ItemGroup>
</Target>
3 голосов
/ 27 апреля 2010

A лучше возможным решением будет

  • поместите общий каталог в каталог решений и поместите туда файлы с общим содержимым.

  • в VS, в каждом проекте, который должен совместно использовать это содержимое, щелкните правой кнопкой мыши add existing item, найдите нужный элемент (ы), выберите, нажмите стрелку вниз на кнопке add и выберите add as link. В проекте вы заметите, что файлы добавляются с наложением «ярлык».

  • В проекте выберите вновь добавленные ссылки и щелкните правой кнопкой мыши -> свойства и выберите Создать действие: содержимое, Копировать в выходной каталог: Копировать всегда.

Это простое решение данной проблемы.

Я использую эту технику для таких вещей, как сценарии SQL и частичные файлы конфигурации (используя configSource) с большим успехом. Это позволяет мне вносить изменения в эти файлы в одном месте, гарантируя, что они будут распространены во всем решении.

Более надежным решением было бы создание проекта со встроенными ресурсами. Это требует немного больше работы для управления контентом на принимающей стороне, но, возможно, оно того стоит в долгосрочной перспективе, так как наличие множества разлетающихся артефактов может стать проблемой.

Надеюсь, это поможет.

1 голос
/ 27 апреля 2010

Подобное решение, подобное предложенному Sky, можно найти в моем ответе «Есть ли способ автоматически включать файлы содержимого в файл проекта asp.net?» .

Позволяет поделиться вашим контентом, но вы не должны касаться папки или ее содержимого внутри VS, потому что это нарушает рекурсивный путь.

Этот подход лучше всего подходит для автоматически сгенерированного контента - вам не нужно беспокоиться о включении новых файлов контента в ваше решение.

И, конечно, вы можете использовать это в нескольких решениях / проектах.

0 голосов
/ 27 апреля 2010

Мы делаем нечто похожее, когда у нас есть «... ReleaseBuilds», которые ссылаются на dll и контент, который нам необходим для конкретных проектов. Компиляция копирует все в папку отладки bin и действительно создает пустую сборку.

В Visual Studio у нас есть событие после сборки в "... RealeaseBuild" (в свойствах проекта), которое копирует / удаляет или запускает пакетные файлы, чтобы убедиться, что у нас есть все необходимые файлы (конфигурации, службы и т. Д.) И т. Д.) и удалить пустую сборку.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...