Создать проект с одним исходным кодом с полными сборками ядра .net, PCL и dotnet, созданными из одного и того же источника C#?

Обновление: это относится к устаревшему набору основных инструментов .net, созданных на основе project.json, этот вопрос и его ответы имеют очень ограниченную полезность в текущих наборах основных инструментов .net, таких как Visual Studio 2017+.

Используя Visual Studio 2015, обновление 3, я пытаюсь выяснить существующие ограничения, которые не позволяют мне сделать следующее:

  1. Для одной кодовой базы C# скомпилируйте полную версию платформы .net и версию PCL, а также основную библиотеку классов .net из одних и тех же источников.

  2. Каталог решения solutiondir\ будет содержать каталог src\, который содержит projectdir\ (Solutiondir\src\projectdir).

  3. Projectdir будет содержать библиотеку классов HelloWorldPCL, созданную как проект classic .net PCL, а также с другими целевыми платформами.

  4. Из того же Projectdir будет скомпилирован тот же HelloWorldPCL для проекта .net 4.6.

  5. Из того же Projectdir будет скомпилирован тот же HelloWorldPCL для .net core.

  6. Все выходные сборки выше будут иметь общий доступ к одному набору кода C#, который может иметь некоторые #if DOTNET, #if NET46 и #if PCL условные определения для обработки вещей, недоступных в различных фреймворках/средах.

Пока я могу сделать большую часть из вышеперечисленного, но когда я пытаюсь, чтобы Projectdir содержал артефакт .net core, такой как project.json или HelloWorldCore.xproj, IDE выдает мне много ошибок, если я пытаюсь создать отдельные проекты .csproj и .xproj в одной папке, так что кажется, это не правильный путь.

С рабочим проектом .csproj, когда я добавляю .xproj и project.json на диск, но мы не добавляли их в само решение, они просто лежат на диске рядом с реальными исходными кодами проекта, я получаю ошибку восстановления пакета Nuget, которая можно только удалить, удалив файл project.json, поэтому очевидно, что невозможно иметь .csproj в каталоге проекта, а также иметь папку project.json. Необходимо выбрать между режимом project.json (стиль проекта .net core) и режимом .csproj (классический стиль проекта C#).

Я построил «сломанную» кодовую базу, которая демонстрирует невозможность использования папки, содержащей как .csproj, так и project.json, а затем попытки собрать проект csproj и project.json без их вмешательства:

https://bitbucket.org/wpostma/helloworldcoreandpcl

Вопрос: есть ли КАКОЙ-ЛИБО способ собрать проект из одного набора исходных файлов C# и использовать в качестве целей полную сборку .net 4.6, а также собственную библиотеку классов .net core, а также сборку PCL который может быть нацелен на какой-либо конкретный профиль .net?

Возражение: вы можете справедливо спросить: «Разве вы не должны просто использовать один PCL и покончить с ним, забыв о нацеливании на полный .net или о создании отдельной dll библиотеки классов .net core?». Возможно, если бы код можно было собрать один раз, из одного источника, без каких-либо условных определений и без каких-либо различий в функциональности, и если бы ограничения, налагаемые профилем PCL с наименьшим общим знаменателем, подходили к профилю netstandard было достаточно, вы могли. Но как насчет случаев, когда это даже невозможно?

Должен ли у нас быть какой-то сложный процесс сборки, в котором мы либо копируем файлы проекта, либо перемещаем исходный код, чтобы достичь единственного .cs исходного файла, целевого для нескольких профилей .net? Или я пропускаю альтернативные решения?

Обновление: похоже, существует проблема с интегрированной средой разработки Visual Studio, которая не позволяет вам напрямую добавить ссылку на библиотеку классов в ваше решение, когда вы создаете его с помощью project.json вместо использования .csproj. Однако приведенное ниже решение, указанное Джоном, указывает на то, что вы должны создать свой проект, а затем создать пакет nuget с dotnet pack. Если вы посмотрите на мою модифицированную демонстрацию здесь, вы увидите pack.cmd содержит шаги, которые я использовал для упаковки пакета nuget, а затем локально «опубликовать» его в файле (локальном каталоге) канала nuget для личного использования.


person Warren P    schedule 05.07.2016    source источник
comment
В качестве более конкретного примера рассмотрим эту кодовую базу, в которой я пытаюсь создать собственные цели основной библиотеки классов .net, в кодовой базе, которая в настоящее время имеет двойные PCL и полносетевые решения, выполняющие две трети того, что я хотел сделать в вопросе выше. . github.com/wpostma/fhir-net-api   -  person Warren P    schedule 05.07.2016
comment
Зачем три разных файла проекта? Я думаю, вы можете сделать все это с помощью одного project.json, который поддерживает три разных фреймворка. (И у вас могут быть разные варианты сборки для разных фреймворков...)   -  person Jon Skeet    schedule 05.07.2016
comment
См. stackoverflow.com/questions/36148363 для получения помощи по выбору PCL из project.json.   -  person Jon Skeet    schedule 05.07.2016
comment
Да, я считаю, что все должно работать. Это что-то вроде дороги менее путешествовали все же.   -  person Jon Skeet    schedule 05.07.2016
comment
Посмотрим, смогу ли я привести полный пример. На какой профиль PCL вы ориентируетесь?   -  person Jon Skeet    schedule 05.07.2016
comment
Я не уверен, что вы имеете в виду под профилем, выбранным выше, но это решение кажется излишне сложным с большим количеством папок и т. д. Я все равно попытаюсь добавить ответ...   -  person Jon Skeet    schedule 05.07.2016
comment
25 КБ и изображение ваших ошибок. Должен быть церемония, на которой мы срываем представителя с вашей формы и отправляем вас в пустыню на осле.   -  person    schedule 05.07.2016
comment
Скриншот в итоге не актуален, удалил.   -  person Warren P    schedule 06.07.2016
comment
Интересное сообщение в блоге: stackify.com/using-both-xproj -и-csproj-с-сетевым-ядром   -  person Warren P    schedule 11.07.2016


Ответы (2)


Я бы попытался использовать чистый project.json подход. Например, вот файл project.json, который создаст единый пакет, поддерживающий netstandard1.0, профиль PCL 328 и .NET 4.6, причем каждая конфигурация определяет свои собственные символы, чтобы вы могли иметь условный код.

{
  "version": "1.0.0",

  "frameworks": {
    "net46": {
      "buildOptions": {
        "define": [ "NET46" ]
      }
    },

    "netstandard1.0": {
      "buildOptions": {
        "define": [ "CORE" ]
      },
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      }
    },

    ".NETPortable,Version=v4.0,Profile=Profile328": {
      "buildOptions": {
        "define": [ "PCL" ]
      },
      "frameworkAssemblies": {
         "mscorlib": "",
         "System": "",
       }
    }
  }
}

Затем просто используйте dotnet pack для создания пакета nuget. (После добавления всех остальных метаданных и т. д.)

person Jon Skeet    schedule 05.07.2016
comment
@WarrenP: попробую воспроизвести. Хотя обратите внимание, что в одном и том же решении я обычно использую зависимость "target": "project", чтобы не указывать номер версии. - person Jon Skeet; 05.07.2016
comment
@WarrenP: Почему в вашей выборке четыре разных проекта? Было бы легче понять, что происходит, если бы у вас было только два: библиотека классов с project.json согласно моему ответу, затем консольное приложение, пытающееся его использовать... (В частности, какой проект терпит неудачу? Это похоже, что это может быть проблема с проектами csproj, которые не могут использовать проекты project.json.Вы должны попробовать либо сделать все на основе project.json, либо упаковать библиотеку классов в пакет nuget, поместить его в локальный источник пакета и зависеть на том.) - person Jon Skeet; 05.07.2016
comment
@WarrenP: Ну, я бы проверил, что полученный файл project.json соответствует вашим ожиданиям. Небольшое усердие на начальном этапе может впоследствии принести дивиденды в плане ремонтопригодности. - person Jon Skeet; 05.07.2016
comment
@WarrenP: Из какого проекта? Может быть, стоит задать второй вопрос, где вы даете конкретику. Я уверен, что мы справимся с этой задачей :) - person Jon Skeet; 05.07.2016
comment
Хорошо. Полный исходный код моего примера, исправленный в соответствии с приведенными выше инструкциями Джона, работает нормально... Код находится здесь: bitbucket.org/wpostma/helloworldcoreandpclv2 - person Warren P; 05.07.2016

Вы можете использовать xproj и csproj вместе с разными файлами project.json. Я сделал сообщение в блоге на тему, которую вы должны проверить: http://stackify.com/using-both-xproj-and-csproj-with-net-core/

По сути, вы создаете имя проекта.project.json, который подбирает csproj, а затем проект.json, который использует xproj. Кажется, работает!

person Matt Watson    schedule 11.07.2016
comment
Спасибо. Это полезная техника! - person Warren P; 12.07.2016