Как вы совместно используете скрипты среди нескольких проектов в одном решении?

Если вопрос не ясен. У меня есть 3 проекта MVC в одном решении. Каждый раз, когда я создаю новый проект, он добавляет папку "Scripts" со всеми файлами .js, которые мне когда-либо понадобятся. Я не хочу, чтобы это создавалось каждый раз для каждого приложения. Есть ли способ ссылаться на сценарии из центральной папки в решении, поэтому все приложения/проекты могут совместно использовать одну общую папку script со всеми распространенными среди них скриптами?

Edit: Пожалуйста, объясните плюсы и минусы этого, если они есть... теперь мне любопытно.

Ответ 1

Вот что я бы рекомендовал:

Щелкните правой кнопкой мыши по решению и создайте новую папку решений с именем Common Javascript Files (или все, что вы хотите называть.

New Solution Folder

Common Javascript Files Solution Folder

Щелкните правой кнопкой мыши на Solution, выберите Open Folder в Проводнике Windows, или перейдите туда вручную для других версий Visual Studio: (

Open Folder In Windows Explorer

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

Common Javascript Files Directory

В этом новом каталоге добавьте файлы, которые необходимо разделить между решениями.

Add Javascript Files To Directory

В Visual Studio выберите папку решений и выберите Добавить - Существующий элемент.

Visual Studio Add - Existing Itme

В диалоговом окне выбора файлов перейдите в каталог, созданный ранее, выберите файлы, добавленные в каталог, и нажмите "Добавить".

Select Files To Add

Solution Folder Files

В каждом проекте, для которого требуется общий файл, щелкните правой кнопкой мыши проект (или каталог в проекте) и нажмите "Добавить - существующий элемент".

Project Add Existing Item

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

Add As Link

Теперь файлы в проектах существенно сокращаются до файлов в папке Solution. Но они рассматриваются как фактические файлы в проекте (включая файлы .CS или Visual Basic, они будут скомпилированы как файлы, которые действительно существуют в проекте).

Linked Files

ПРОФИ

  • Файлы по-настоящему доступны для разных проектов во время разработки
  • Можно добавить только файлы, необходимые для каждого проекта, это не все или ничего
  • Не требуется настройка в IIS (виртуальный каталог и т.д.)
  • Если решение находится в TFS Source control, вы можете добавить каталог в источник TFS, и файлы с общим доступом будут контролироваться исходным кодом.
  • Редактирование файла, выбрав его в проекте, отредактирует фактический файл.
  • Удаление связанного файла не удаляет файл.
  • Это не только файлы JS, связанные файлы могут быть ЛЮБЫМ файлом, который вам может понадобиться (изображения, Css, Xml, CS, CSHTML и т.д.)

CONS

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

Ответ 2

Лучшее, что нужно сделать, imo - это свернуть собственный CDN... В основном просто создайте другой сайт в IIS и дайте ему его привязку, например. " http://cdn.somedomain.com"

Затем сохраните все ваши css/js/fonts/shared images и т.д. на сайте CDN и соединитесь с ними с других сайтов.

В результате решаются 2 проблемы,

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

Я добавил этот ответ, потому что вижу, что многие люди ссылаются на создание виртуальных каталогов. Хотя это действительно разделяет файлы, он создает несколько путей загрузки для них, что является крайне пустой тратой пропускной способности. Зачем пользователям загружать jquery.js(1 * количество сайтов), когда вы можете разрешить им загружать его один раз (cdn.somedomain.com).

Также, когда я говорю об отсутствии пропускной способности, я говорю не только о пропускной способности сервера, я говорю о мобильных пользователях по планам данных... Например, я ударил наш сайт HR (insuance и т.д.) на моем сайте телефон на другой день, и он потреблял 250 МБ прямо за воротами, загружал jquery и кучу вещей по 5 раз каждый... На план 2gb в месяц, сайты, которые действительно меня раздражают.

Ответ 3

Вот оно, ИМО - лучшее и самое простое решение, я потратил неделю, пытаясь найти лучший и самый простой способ, который всегда имел больше минусов, чем профессионалы:

Resources(DLL)
  Shared
    images
      image.png
    css
      shared.css
    scripts
      jquery.js


MvcApp1
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

MvcApp2
  Images
  Content
  Shared <- We want to get files from above dll here
  ...

Добавить следующие в MvcApp1 → Project → MvcApp1 Properties → Build events → post build event:

start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y

Вот объяснение в том, что он делает: Включая каталог файлов содержимого содержимого сборки из ссылочной сборки на том же уровне, что и каталог bin

Сделайте то же самое для MvcApp2. Теперь после каждой сборки свежие статические файлы будут скопированы в ваше приложение, и вы сможете получить доступ к файлам типа "~/Shared/css/site.css"

Если вы хотите, вы можете настроить приведенную выше команду, чтобы скопировать скрипты из .dll в папку сценариев каждого приложения, таким образом вы могли бы переместить некоторые скрипты в .dll, не изменяя никаких путей, вот пример:

Если вы хотите скопировать только сценарии из ресурсов /Shared/scripts в MvcApp1/scripts после каждой сборки:

start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y

Ответ 4

В IIS создайте виртуальную папку, указывающую на одну и ту же папку сценариев для каждого из трех приложений. Тогда вам нужно сохранить их только в одном приложении. Существуют и другие альтернативы, но это зависит от того, как структурируются ваши приложения.

Edit

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

Ответ 5

Предложение, которое позволит вам отлаживать ваши сценарии без повторной компиляции проекта:

  • Выберите один проект master "(который вы будете использовать для отладки) и добавьте к нему физические файлы
  • Используйте функцию "Добавить как ссылку", как описано в Eric, чтобы добавить файлы script к другим проектам в решении
  • Используйте задачу CopyLinkedContentFiles для сборки, как предложено в комментарии Mac, чтобы скопировать файлы на второй в ваши дополнительные проекты.

Таким образом вы можете изменить сценарии в проекте master без перезапуска отладчика, который для меня делает мир различий.

Ответ 6

Большинство файлов, которые включены по умолчанию, также доступны через различные CDN.

Если вы не добавляете свои собственные скрипты, вам может даже не понадобиться каталог сценариев.

Microsoft CDN для скриптов: http://www.asp.net/ajaxlibrary/cdn.ashx