Як ви ділитесь сценаріями між кількома проектами в одному рішенні?


76

На випадок, якщо питання не було зрозумілим. У мене є 3 проекти MVC в одному рішенні. Кожного разу, коли я створюю новий проект, він додає папку "Сценарії" з усіма файлами .js, які мені коли-небудь знадобляться. Я не хочу, щоб це створювалося щоразу для кожного додатка. Чи існує спосіб посилання на сценарії з центральної папки у рішенні, щоб усі програми / проекти могли спільно використовувати одну загальну папку сценаріїв із усіма загальними серед них сценаріями?

Редагувати: Будь ласка, поясніть плюси і мінуси цього, якщо такі є ... тепер мені цікаво.


Це не працює для папок, але ви можете зв’язати файл з іншого проекту. Клацніть правою кнопкою миші папку та додайте існуючий елемент, знайдіть свій файл в іншому проекті, клацніть стрілку поруч із кнопкою Додати та виберіть "Додати як посилання". Файл фізично не буде існувати у правильному розташуванні, доки ви не розгорнете його, тому це не буде працювати для статичних файлів скриптів під час налагодження у Visual Studio.
Nick VanderPyle

Відповіді:


118

Ось, що я б порекомендував:

Клацніть правою кнопкою миші рішення та створіть нову папку рішення із назвою Common Javascript Files(або як би ви не хотіли її викликати.

Нова папка рішення

Загальна папка рішення файлів Javascript

Клацніть правою кнопкою миші Рішення, натисніть Відкрити папку в Провіднику Windows або перейдіть туди вручну для інших версій Visual Studio :(

Відкрийте папку в Провіднику Windows

У каталозі рішень створіть каталог з тим самим іменем, що і папка рішення (папки рішення зазвичай не відповідають каталогам на рівні вихідного коду, але це буде для розуму).

Загальний каталог файлів Javascript

У цьому новому каталозі додайте файли, якими потрібно ділитися між рішеннями.

Додавання файлів Javascript до каталогу

У Visual Studio клацніть папку рішення та виберіть Додати - існуючий елемент .

Visual Studio Add - Існуюча тема

У діалоговому вікні вибору файлу перейдіть до попередньо створеного каталогу, виберіть файли, додані до каталогу, та натисніть Додати .

Виберіть Файли для додавання

Файли папок рішення

У кожному проекті, який потребує спільного файлу, клацніть правою кнопкою миші проект (або каталог у проекті) та натисніть Додати - існуючий елемент .

Проект Додати існуючий елемент

Перейдіть до спільного каталогу, виберіть файли та клацніть стрілку спадного меню, а потім натисніть Додати як посилання .

Додати як посилання

Тепер файли у проектах - це, по суті, ярлики до файлів у папці рішень. Але вони розглядаються як фактичні файли в проекті (сюди входять файли .CS або Visual Basic, вони будуть скомпільовані як файли, які насправді існують у проекті).

Зв’язані файли

Плюси

  • Файли дійсно обмінюються між проектами під час проектування
  • Можна додавати лише файли, необхідні для кожного проекту, це не все або нічого
  • Не вимагає будь-якої конфігурації в IIS (віртуальний каталог тощо)
  • Якщо рішення знаходиться в контролі джерела TFS, ви можете додати каталог до джерела TFS, і спільні файли будуть керовані джерелом.
  • Редагуючи файл, вибравши його в проекті, ви зміните фактичний файл.
  • Видалення пов'язаного файлу не видаляє його.
  • Це не обмежується файлами JS, пов'язані файли можуть бути БУДЬ-ЯКИМ файлом, який вам може знадобитися (Зображення, Css, Xml, CS, CSHTML тощо)

ПРОТИВ

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

38
Також корисно відзначити, що пов'язані файли не будуть доступні під час налагодження, якщо до файлу проекту не додано завдання для ручного копіювання пов'язаних файлів, як описано тут .
Mac

1
Коли я публікую проект, файли не копіюються в структуру папок, яку я створив. Будь-яка ідея, як це вирішити?
Фонсіні,

2
@Fonsini Правильно встановіть властивості пов'язаних файлів.
Ерік Філіпс,

1
Проблема, з якою я стикаюся, полягає в тому, що при спробі включити файли JS в HTML він хоче вирішити справжню папку, а не пов'язану папку. Це зовсім не практично.
MarzSocks

1
Можливо, вам буде цікаво дізнатись, що ця відповідь (побічно) обговорюється тут на мета .
Ілмарі Каронен

24

Найкраще, що потрібно зробити, imo, - це прокрутити свій власний CDN ... В основному просто створіть інший сайт у IIS і надайте йому власне прив'язку, наприклад "http://cdn.somedomain.com"

Потім збережіть усі свої css / js / шрифти / спільні зображення тощо на сайті CDN та перекладіть на них з інших сайтів.

Це вирішує 2 проблеми,

  1. Всі ваші матеріали діляться, коли це потрібно, і вам потрібно лише керувати 1 редакцією на файл.
  2. Ваші браузери користувачів можуть кешувати їх в одному місці, а не завантажувати копії ваших матеріалів для кожного веб-сайту, який їх використовує.

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

Крім того, коли я кажу про втрату пропускної здатності, я не просто кажу про пропускну здатність сервера, я говорю про мобільних користувачів на тарифних планах ... Як приклад, я потрапив на сайт HR-компаній (страхування тощо) на своєму телефоні, інший день, і це споживало 25 Мб прямо з воріт, завантажував jquery і купу речей 5 разів кожен ... На тарифному плані 2 Гб на місяць веб-сайти, які справді мене дратують.


Думав, я б додав, що для посилання на них використовуйте синтаксис //cdn.somedomain.com, якщо ви налаштували обидва http / https, він буде встановлений за замовчуванням для будь-якого інклюдера. Крім того, якщо у вас є CD-розробник та виробничий cdn, ви можете зберегти URL-адресу cdn у appSettings, наприклад, ProdCdnUrl та DevCdnUrl, а потім використовуйте умовну компіляцію, щоб вибрати таку для конфігурації збірки проекту, наприклад #if DEV getdevurl #if PROD getprodurl .. Потім використовуйте його у своєму шаблоні для бритви, щось на зразок script src = "@ (cdnUrl) / lib / bootstrap ..."
Райан Манн,

1
Більше подальших дій щодо цього, я фактично кинув використовувати Script and Style Bundles повністю за допомогою цього методу. Натомість я використовую Node.js, Gulp, Css-Minify, Uglify, gulp-sass тощо. Тому я просто роблю "Gulp compile-css" і "gulp compile-js" і "gulp watch-css" і "gulp watch- js "у вузлі для обробки транпіляції мого Sass та ES6 Javascript у javascript css та es5. Також у мене є файл node project.json у корені мого веб-додатка .Net mvc і я використовую інструменти vs node для вікна інтерактивного вузла для роботи з node від VS, а також розширення Command Line тут для VS.
Райан Манн,

Дякуємо за нове розуміння, подане у вашому коментарі від лютого 2016 року.
Теофіл

Я знову змінився. Зараз я використовую Gulp4 з Babel і Rollup Js і налаштував зведений пакет для компіляції в IIFE. І я компілюю активи в nuget-пакети. На нашому CDN у нас є основне налаштування проекту .Net через ядро ​​dotnet, де ми можемо додавати пакети та оновлені пакети та використовувати відновлення dotnet. Отже, якщо ми хочемо додати щось до cdn, ми робимо це в nuget-пакеті і встановлюємо його для транпіляції при побудові, і "dotnet pack" зробить пакет із папки "dst", а при встановленні додає dst папку до цільового проекту з ірахією, яку ми хочемо. Тож ми можемо керувати CDN за допомогою dotnet cli.
Райан Манн,

Крім того, якщо ми оновимо пакет, ми можемо просто запустити скрипт оновлення dotnet і налаштувати його в управлінні випусками / автоматизації devops.
Райан Манн

11

Ось справа, IMO - найкраще і найпростіше рішення, я тиждень намагався знайти найкращий і найпростіший спосіб, який завжди мав більше мінусів, ніж плюсів:

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 наступне -> Проект -> Властивості MvcApp1 -> Події збірки -> Подія збірки:

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

Ось пояснення щодо того, що він робить: Включаючи Створення каталогу файлів вмісту дій зі згаданої збірки на тому самому рівні, що і каталог bin

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

Якщо ви хочете, ви можете налаштувати наведену вище команду для копіювання сценаріїв з .dll в папку скриптів кожного додатка, таким чином ви можете перенести деякі сценарії в .dll без необхідності змінювати будь-які шляхи, ось приклад:

Якщо ви хочете копіювати лише сценарії з Resources / Shared / scripts у MvcApp1 / script після кожної збірки:

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

3 запитання: 1) Що станеться, якщо файл буде видалено з Ресурсів / Спільного доступу - схоже, він не буде видалений з копії папки MvcApp? 2) Чи є спосіб отримати Visual Studio для видалення цих файлів $(SolutionDir)після завершення запуску. Залишення їх там може заплутати інших розробників. 3) Ви маєте (DLL) у дужках після папки Resources. Якийсь конкретний спосіб це налаштувати?
Адам

1) Вони, звичайно, залишаться в папці, оскільки ми їх лише копіюємо 2) Рішенням буде видалення всіх файлів у папці перед копіюванням, ви додасте щось подібне перед xcopy: stackoverflow.com/questions/768282/… , або напишіть пакетний скрипт, який перевіряє файли у двох папках та видаляє відмінності та викликає його, використовуючи як: stackoverflow.com/questions/12764847/… 3) Він призначений лише для демонстрації, це його dll-проект під назвою Resources
formatc

@Adam див. Вище коментар.
formatc

Кожного разу, коли ви редагуєте спільний ресурс, вам потрібно буде побудувати проект, щоб побачити зміни, чи не так?
розчавити

@crush Так, але ви можете створити пакетний сценарій і помістити в нього ці команди, а потім замінити подію post build, щоб запустити ваш сценарій, і ви можете запустити його вручну, можливо, у VS є "макрос" або щось інше, що дозволить вашому сценарію запуску про зміну файлу.
formatc

6

Це пізня відповідь, але Microsoft додала тип проекту під назвою Shared Projectstart, Visual Studio 2013 Update 2який може робити саме те, що ви не хочете, не маючи linkфайлів.

Посилання на спільний проект відображається під вузлом Посилання в Провіднику рішень, але код та ресурси спільного проекту розглядаються так, ніби це файли, пов’язані з основним проектом.

"У попередніх версіях Visual Studio ви могли ділитися вихідним кодом між проектами, додавши -> Існуючий елемент, а потім вибравши" Посилання ". Але це було якось незграбно, і кожен окремий вихідний файл потрібно було вибрати окремо. З переходом до підтримки кількох розрізнених платформ (iOS, Android тощо), вони вирішили полегшити обмін джерелами між проектами, додавши концепцію спільних проектів ".

https://blogs.msdn.microsoft.com/somasegar/2014/04/02/visual-studio-2013-update-2-rc-windows-phone-8-1-tools-shared-projects-and-universal- windows-apps /

Інформація з цієї теми:

У чому різниця між спільним проектом та бібліотекою класів у Visual Studio 2015?

https://stackoverflow.com/a/30638495/3850405


Це добре звучить на папері, але я ще не бачив прикладу, щоб спільні проекти успішно використовувались із файлами JavaScript. Ви можете впевнено створити спільний проект і помістити туди свої сценарії, але веб-проект, здається, не розпізнає їх належним чином.
Натанаель

3

Пропозиція, яка дозволить вам налагоджувати сценарії, не перекомпілюючи проект:

  • Виберіть один « головний » проект (який ви будете використовувати для налагодження) та додайте до нього фізичні файли
  • Використовуйте функцію "Додати як посилання", як описано у відповіді Еріка, щоб додати файли скриптів до інших проектів, що вирішуються
  • Використовуйте завдання CopyLinkedContentFiles у Build, як пропонується у коментарі Mac, щоб скопіювати файли на другий у ваші додаткові проекти

Таким чином, ви можете змінювати сценарії в проекті " master " без перезапуску відладчика, що, як на мене, робить світ різним.


Чи можете ви пояснити, як можна змінювати файли головного проекту та робити зміни доступними під час роботи програми без перезапуску відладчика? Зв’язані файли копіюються лише під час збирання, і ви не можете збирати, не зупиняючи налагоджувач спочатку.
pbalaga

Якщо ви додасте фізичні файли до "master" (а не лише посилання), ви можете змінити master без перезапуску. В інших проектах пов'язані файли будуть скопійовані під час збірки, але це має менший вплив, оскільки більшу частину свого часу я проводив під керуванням майстра.
DivineOps

Це слід позначити як відповідь, оскільки клопоту набагато менше! Модифікація, яку потрібно внести до .csproj, така: <! - Скопіюйте зв’язані файли вмісту до їх розташування під час побудови. -> <Target Name = "CopyLinkedContentFiles" BeforeTargets = "Build"> <Copy SourceFiles = "% (Content.Identity)" DestinationFiles = "% (Content.Link)" SkipUnchangedFiles = "true" OverwriteReadOnlyFiles = "true" Condition = "'% (Content.Link)'! = ''" /> </Target>
barbara.post

2

У IIS створіть віртуальну папку, що вказує на ту саму папку сценаріїв для кожної з 3 програм. Тоді вам потрібно буде тримати їх лише в одній програмі. Є й інші альтернативи, але це насправді залежить від структури ваших додатків.

Редагувати

Страшнішою ідеєю є використання областей. У загальній зоні є каталог сценаріїв із набором сценаріїв, які потрібно скомпілювати. Потім подавайте їх самі, виймаючи з dll. Це може бути гарною ідеєю, якщо ви передбачите, що спільна зона матиме більше функціональних можливостей пізніше.


Це чудова ідея, коли проект знаходиться на сервері. А як щодо того, коли проект все ще знаходиться у вікні розробки у Visual Studio?
Nick VanderPyle

@NickVanderPyle та сама ідея буде працювати. Має змогу налаштувати його, незалежно від того, використовуєте ви адаптери петлі та різні сайти чи просто різні програми.
Юрій Факторович

О Я бачу. Це буде працювати, якщо ви запускаєте та налагоджуєте IIS локально та можете використовувати віртуальні папки. Гарний дзвінок.
Nick VanderPyle

Що ви думаєте про точку з'єднання NTFS, якщо IIS недоступний?
Nick VanderPyle

@NickVanderPyle, вам доведеться видалити каталоги сценаріїв з 2 проектів, але так, це теж звучить досить добре.
Юрій Факторович

1

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

Якщо ви не додаєте власні власні сценарії, можливо, вам навіть не знадобиться каталог сценаріїв.

CDN корпорації Майкрософт для сценаріїв: http://www.asp.net/ajaxlibrary/cdn.ashx

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.