Подтвердить что ты не робот

Добавить файл в качестве ссылки на Visual Studio - Debug vs Publish

Каждый раз, когда мне нужно связать файл с проектом ASP.NET как ссылку, всегда есть что-то, что я забыл сделать, потому что Visual Studio слишком грубо и раздражает их. У него есть ошибка/ограничение, поэтому он не копирует файл в папку вывода Debug, и мы должны изменить свойства файла, чтобы он также был скопирован в папку вывода публикации.

Я изучил это с трудом, после многих исследований, и создал цель AfterBuild, чтобы помочь облегчить этот процесс. Однако при добавлении файла все еще нужно выполнить ручную работу.

Вот пример для проекта, который я поддерживаю. Предположим, мы хотим добавить файл YIUCARD в папку "Утилиты" проекта ASP.NET.

1) Щелкните правой кнопкой мыши папку "Утилиты" в Visual Studio и выберите "Добавить → Существующий элемент".

Step 1

2) Выберите файл для добавления, нажав на него ONCE (не дважды щелкните).

Step 2

3) Нажмите стрелку рядом с кнопкой "Добавить" и выберите "Добавить как ссылку".

Step 3

В настоящий момент это ничего не сделает. Файл не будет скопирован в любую папку (Debug и Publish). Он просто добавлен в проект.

4) Щелкните правой кнопкой мыши в файле и откройте "Свойства".

Step 4

5) Изменение: "Построить действие" на "Контент" "Копировать в каталог вывода" на "Копировать всегда"

Step 5

В это время файл будет скопирован в папку вывода публикации (в любом месте, которое мы определяем при публикации). Однако, когда мы отлаживаем локально (F5), это не будет работать, потому что файл не скопирован в локальную папку "Утилиты" на базе кода.

6) Сохраните изменения в Visual Studio, выбрав "Сохранить все". Это значит, что файл ".csproj" сохраняется, поскольку мы внесли в него изменения, и теперь мы отредактируем его вручную.

Step 6

7) Откройте ".csproj" в Notepad ++.

Step 7

8) Добавьте файл в событие "BeforeBuild" (здесь мое):

Step 8

 <Target Name="BeforeBuild">
    <ItemGroup>
      <UtilitiesFiles Include="..\path\to\file\REDOPXX.NEW" />
      <UtilitiesFiles Include="..\path\to\file\REDFMTST" />
      <UtilitiesFiles Include="..\path\to\file\JOBCARD" />
      <UtilitiesFiles Include="..\path\to\file\YIUCARD" />
    </ItemGroup>
    <Copy SourceFiles="@(UtilitiesFiles)" DestinationFolder=".\utilities" SkipUnchangedFiles="true" />
  </Target>

9) У меня есть событие AfterBuild для режима Release, которое автоматически публикует проект для меня, так что файлы идут непосредственно в папку вывода, которую я хочу:

  <Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release' ">
    <PropertyGroup>
      <OutputDir>..\path\to\publish\MyProject</OutputDir>
    </PropertyGroup>
    <Message Importance="High" Text="Output DIR: $(OutputDir)" />
    <RemoveDir Directories="$(OutputDir)" ContinueOnError="true" />
    <MSBuild Projects="MyProject.csproj" Properties="Configuration=$(Configuration);WebProjectOutputDir=$(OutputDir);OutDir=$(OutputDir)bin\" Targets="ResolveReferences;_CopyWebApplication" />
  </Target>

10) Сохраните файл в Notepad ++ и перезагрузите его в Visual Studio.

Step 10

Когда вы создадите проект, файл будет скопирован в папки "Отладка" и "Отпуск/публикация"!

Однако я хотел бы знать, есть ли более простой/интуитивный способ сделать это.

Вы можете сказать, что это будет исправлено путем изменения выходной папки Debug так же, как и папки Release/Publish, чтобы файлы были там после первого опубликованного вами. Однако, обратите внимание, что есть и ошибка. Если я использую папку вывода, отличную от "bin", файлы aspx будут жаловаться на то, что они не смогут найти сборки. Даже если я установил "Копировать в выходной каталог" в "Копировать всегда", он будет жаловаться, что "Global.asax.cs" не найден.

См. следующие вопросы:

Сообщение об ошибке Parser: не удалось загрузить тип 'TestMvcApplication.MvcApplication'

"Невозможно загрузить тип [пространство имен].Global" вызвав мое горе

Является ли это исправлено/улучшено в новых версиях Visual Studio?

4b9b3361

Ответ 1

MSBuild.WebApplication.CopyContentLinkedFiles NuGet может вам помочь. Этот пакет добавляет цель MSBuild, которая копирует все файлы содержимого, добавленные в качестве ссылки на папку веб-приложения во время сборки.

Ответ 2

Если целью является включение папок контента (например, сценариев, изображений), вам не следует управлять отдельными файлами. Вместо этого включите эти папки в свои файлы сборки и публикации.

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

Ознакомьтесь с этими ссылками:

Есть ли способ автоматически включать файлы содержимого в файл проекта asp.net?

Развертывание веб-сайта ASP.NET с помощью Visual Studio: развертывание дополнительных файлов

Ответ 3

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