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

Объяснение раздела проектов в Global.json в ASP.NET 5

Я заметил, что при создании нового проекта ASP.NET 5 существует каталог src, который совершенно мне подходит, так как я всегда ставил весь код решения в каталог с именем source.

Я заметил, что есть файл global.json, который по умолчанию имеет в нем следующий контент:

{
  "projects": [ "src", "test" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

Я нашел следующее в документации ASP.NET 5: Свойство projects определяет, какие папки содержат исходный код для решения. По умолчанию структура проекта помещает исходные файлы в папку src, позволяя размещать артефакты в папке соседа, что упрощает исключение таких вещей из исходного элемента управления.

Однако, вот структура проекта, которую я имею в виду (в основном это будет 2 больших проекта, которые я хочу при одном и том же решении):

MySolution
    MySolutionProject1Src
        client
            p1.WebAPI
        business
            p1.Business
            p1.Model
        data
            p1.Repository
        test
            p1.BusinessTests
            p1.WebAPITests


    MySolutionProject2Src
        client
            p2.Web
        business
            p2.Business
            p2.Model
        data
            p2.Repository
        test
            p2.BusinessTests

Итак, я бы обновил global.json, чтобы быть следующим? (по одному для каждой родительской директории):

{
  "projects": [ "MySolutionProject1Src", "MySolutionProject2Src" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

или это должно быть нечто более похожее (по одному для каждого отдельного подкаталога):

{
  "projects": [ "MySolutionProject1Src/client", "MySolutionProject1Src/business", "MySolutionProject1Src/data" "MySolutionProject1Src/test", "MySolutionProject2Src/client", "MySolutionProject2Src/business", "MySolutionProject2Src/data" "MySolutionProject2Src/test" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

Или просто просто оставить его как "src" и поместить все как подпапки под src..

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

4b9b3361

Ответ 1

Прежде всего, я перешлю вам часть документации, которая описывает global.json.

{
  "projects": [ "src", "test" ],
  "sdk": {
        "version": "1.0.0-beta5",
        "runtime": "clr",
        "architecture": "x86"
  }
}

version (и необязательно runtime и architecture) важны, потому что ваш компьютер имеет несколько версий dnx.exe. Вы можете изучить каталог %USERPROFILE%\.dnx\runtimes, чтобы просмотреть все установленные среды выполнения. Часть "sdk" global.json определяет версию dnx.exe из одной из установленных вами версий.

Важно понимать "projects" часть global.json, что она будет отсканирована всех папок sibling на любом уровне под каждым из каталога. Каждый project.json, который будет найден, будет интерпретироваться как проект решения.

Вы можете, например, загрузить часть ASP.NET и поместить ее в новую подпапку вашей иерархии решений. Например, вы можете загрузить RC1 источник Entity Framework 7 (файл), любой извлечет zip файл в новой папке ef внутри папки src вашего проекта. Вы увидите, что через короткое время после повторного открытия решения список вашего проекта будет длиннее и длиннее, и все компоненты Entity Framework 7 будут включены в ваше решение. Таким же образом вы можете извлечь загруженные источники в отдельный каталог C:\aspnet\EF7 и использовать

{
  "projects": [ "src", "c:/aspnet/EF7" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

У вас будут те же эффекты. Если позже вы решите удалить отладку источников Entity Framework 7, вы должны просто исключить "c:/aspnet/EF7" из global.json, а затем удалить в ранее добавленные проекты Visual Studio путем выбора в Solution View и нажать Del.

Я думаю, что он должен очистить возможности, которые у вас есть в структурах папок.

Еще одним очень важным необязательным файлом, который может существовать в иерархии решений, является файл NuGet.config. Он определяет канал NuGet, где пакеты будут загружены. Проблема в том, что существует много репозиториев NuGet (см. ответ), которые имеют разные предварительные версии компонентов ASP.NET 5. Если вы используете точные зависимости, например

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"

тогда нужно только иметь явную версию в репозитории NuGet. Проблема в том, что иногда используется зависимость, например

"EntityFramework.MicrosoftSqlServer": "7.0.0-*"

чтобы загрузить последнюю версию пакета. Если вы используете неправильный фид NuGet, вы можете получить ранние сборки RC2, которые несовместимы с другими пакетами RC1 (по крайней мере, из-за переименования многих компонентов между бета-версиями). Чтобы ваше решение (все ваши проекты) использовало RC1, вы можете поместить следующий NuGet.config в папку решения (поверх всех проектов), например, следующий контент

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageRestore>
    <clear /> <!-- ensure only the sources defined below are used -->
    <add key="automatic" value="False" />
  </packageRestore>
  <packageSources>
    <add key="AspNetVNext" value="https://www.myget.org/F/aspnetmaster/api/v3/index.json" />
    <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <activePackageSource>
    <add key="AspNetVNext" value="true"  />
    <add key="NuGet" value="true"  />
  </activePackageSource>
</configuration>

Смотрите документацию. Я рекомендую вам открыть командную строку в какой-либо папке проекта и выполнить

dnu feeds list

команды. Он покажет, что все NuGet.config из текущей и родительских папок и глобального файла %appdata%\NuGet\NuGet.Config будут объединены. NuGet будет искать пакеты во всех активных репозиториях. Это будет https://api.nuget.org/v3/index.json и https://www.myget.org/F/aspnetmaster/api/v3/index.json в приведенном выше случае.

Возможные конфликты могут быть, если существует несколько NuGet.config, указывает разные каналы NuGet или разрешает/отключает некоторые каналы. Здесь помогает команда dnu feeds list. Вы должны всегда сканировать все NuGet.config файлы в иерархии проектов, чтобы предотвратить/разрешить конфликты. Разрешение многих конфликтов состоит в основном в использовании правильных каналов или использовании явных версий для разрешения пакетов.

Я рекомендую вам прочитать статью, в которой описывается Наследование NuGet Наследование.

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

solution
    src
        project
        folderWithProjects

и поместить global.json и NuGet.config в каталог решений. Место по умолчанию для тестовых проектов: отдельно от основных проектов:

solution
    src
        project
        folderWithProjects
    test
        testproject1
        testproject2

(вы можете изучить структуру Entity Framework 7 на GitHub или MVC6 здесь). Вы можете следить за структурой или выбирать другое местоположение и изменять "projects" часть global.json.

ОБНОВЛЕНО:Microsoft сделала много изменений между RC1 и RC2. dnx.exe не будет использоваться больше в ASP.NET Core. Вместо этого следует использовать dotnet.exe. Описание новых/измененных global.json и project.json еще не полностью задокументировано. Вы можете увидеть предварительную версию документации здесь. Ссылки на старую документацию (под https://docs.asp.net/en/latest/dnx) теперь разбиты.