Как настроить сборку в VS2019
От: Karpov  
Дата: 06.01.21 18:31
Оценка:
Добрый день.

C#, VS2019, пишу программу, которая использует плагины.

Все в одном решении, плагины в виде библиотек классов, в зависимостях у программы прописаны плагины, студия при сборке складывает все в один каталог, все работает. Но. Так как плагины используют сторонние компоненты в каталоге с программой получается адовая каша из кучи файлов и определить что к чему относится невозможно. Отсюда вопрос:

Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?
... << RSDN@Home 1.3.109 alpha 5 rev. 60>>
Re: Как настроить сборку в VS2019
От: #John США https://github.com/ichensky
Дата: 06.01.21 21:15
Оценка:
Здравствуйте, Karpov, Вы писали:

K>Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?


В зависимостях к проекту, для либ поставить copy:no.
В либах в свойствах проекта добавить build-postscript, который будет их копировать `plugins\<plugin name>`.
В конфиге проекта(runtimeconfig.json/*.deps.json) прописать ссылки на зависимые либы, ну или добавить код при запуске проекта Assembly.Load('plugins\...').
Re[2]: Как настроить сборку в VS2019
От: Karpov  
Дата: 06.01.21 22:27
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте, Karpov, Вы писали:


K>>Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?


J>В зависимостях к проекту, для либ поставить copy:no.

J>В либах в свойствах проекта добавить build-postscript, который будет их копировать `plugins\<plugin name>`.
J>В конфиге проекта(runtimeconfig.json/*.deps.json) прописать ссылки на зависимые либы, ну или добавить код при запуске проекта Assembly.Load('plugins\...').

А в build-postscript я могу как-то адресоваться к каталогу сборки проекта, который зависит от либы, или придется прибивать гвоздями к абсолютным путям? Хотелось бы, чтобы решение было переносимым...
... << RSDN@Home 1.3.109 alpha 5 rev. 60>>
Re: Как настроить сборку в VS2019
От: bnk СССР http://unmanagedvisio.com/
Дата: 06.01.21 22:37
Оценка: +1
Здравствуйте, Karpov, Вы писали:

K>Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?


А почему просто не указать куда класть собранные плагины?! В смысле в настройках проекта, Build => Output Path?
Re[3]: Как настроить сборку в VS2019
От: #John США https://github.com/ichensky
Дата: 07.01.21 00:28
Оценка:
Здравствуйте, Karpov, Вы писали:

K>А в build-postscript я могу как-то адресоваться к каталогу сборки проекта, который зависит от либы, или придется прибивать гвоздями к абсолютным путям? Хотелось бы, чтобы решение было переносимым...


Да, обычно такой ~код пишут:
copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

(или с командой `xcopy`)
Есть и другие полезные макросы:
https://docs.microsoft.com/en-us/cpp/build/reference/common-macros-for-build-commands-and-properties?redirectedfrom=MSDN&amp;view=msvc-160


--
Можно и без студии, просто сделать отдельно батник/(sh скрипт для wsl: bash -c "cd ..; dotnet build ; cp .. .."), который будет билдить все плагины, копировать в нужную директорию.
Впринципе, второй вариант мне больше нравится, т.к. про build-post скрипт другой человек может сразу и не догадаться.
А батник, сразу на виду и его подправить меньше времени займет, чем открывать проект в студии, но тут тоже есть свои минусы.
Отредактировано 07.01.2021 1:06 #John . Предыдущая версия .
Re[2]: Как настроить сборку в VS2019
От: Вертер  
Дата: 07.01.21 20:55
Оценка:
K>>Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?

J>В зависимостях к проекту, для либ поставить copy:no.

J>В либах в свойствах проекта добавить build-postscript, который будет их копировать `plugins\<plugin name>`.

у вас дебаг, скорее всего, не будет нормально работать так как скомпилированные pdb файлы будут в другом месте лежать
Re: Как настроить сборку в VS2019
От: Вертер  
Дата: 07.01.21 21:13
Оценка:
K>Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?

как написали ранее, в настройках проектов плагинов надо задать правильный output параметр.

для "старых" проектов:

<OutputPath>$(SolutionDir)\Output\$(Configuration)\$(Platform)\Plugins\$(RootNamespace)\</OutputPath>
<IntermediateOutputPath>$(SolutionDir)\Output\Temp\$(Configuration)-$(Platform)\$(RootNamespace)\</IntermediateOutputPath>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|win32'">...</>
...


для .NET 5 проектов:
common.pros файл:
<PropertyGroup>
    <SolutionDir Condition="'$(SolutionDir)' == ''">..\</SolutionDir>
    <MyAppRootDir>$(SolutionDir)..</MyAppRootDir>
    <MyAppOutputPath>$(MyAppRootDir)\output</MyAppOutputPath>
    <IntermediateOutputPath>$(MyAppOutputPath)\obj\$(Configuration)\$(AssemblyName)\</IntermediateOutputPath>
    <OutputPath>$(MyAppOutputPath)\$(Configuration)\</OutputPath>
    <PluginOutputPath>$(OutputPath)Plugins</PluginOutputPath>
</PropertyGroup>


В каждом проекте Plugin:

<Project Sdk="Microsoft.NET.Sdk">
    <Import Project="..\common.props" />
    <PropertyGroup>
        <OutputType>Library</OutputType>
    </PropertyGroup>
    <PropertyGroup>
    <OutputPath>$(PluginOutputPath)\$(AssemblyName)\</OutputPath>
  </PropertyGroup>
  ...
</Project>
Отредактировано 07.01.2021 21:14 Вертер . Предыдущая версия .
Re[2]: Как настроить сборку в VS2019
От: Karpov  
Дата: 10.01.21 01:18
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Karpov, Вы писали:


K>>Можно ли как-то объяснить студии, чтобы мои плагины вместе с их зависимостями при сборке автоматически раскладывались в каталог plugins\<plugin name> в каталоге со сборкой?


bnk>А почему просто не указать куда класть собранные плагины?! В смысле в настройках проекта, Build => Output Path?


Как ни странно, именно так я и сделал и оно вполне работает — в каталоге с решением сделал каталог bin, куда банально перенаправил вывод всех сборок. Оказывается, студия прекрасно понимает относительные пути вида ../bin/Debug/... и даже сама их подставляет вместо полных путей.

Вобчем, я не настоящий программист и узнал много нового. Спасибо.
... << RSDN@Home 1.3.109 alpha 5 rev. 60>>
Re[3]: Как настроить сборку в VS2019
От: varenikAA https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 11.01.21 07:36
Оценка:
Здравствуйте, Karpov, Вы писали:

K>Вобчем, я не настоящий программист и узнал много нового. Спасибо.


Скромно, не каждый задумается об автоматизации сборки.
Большая проблема msbuild что триггер публикации срабатывает несколько раз.
Я обхожу это через создание файла флажка и чекаю его наличие в скрипте (fsx).
Довольно удобный язык для скриптов, правда рантайм жутко тормозной. ну для скриптования потянет.
Есть еще fake(поверх F#) но его я еще изучал.
Re[4]: Как настроить сборку в VS2019
От: Вертер  
Дата: 11.01.21 19:38
Оценка:
AA>Большая проблема msbuild что триггер публикации срабатывает несколько раз.
AA>Я обхожу это через создание файла флажка и чекаю его наличие в скрипте (fsx).

Что вы имеете ввиду?

set slnConfiguration=Release

rem Build the solution
dotnet build %slnFolderName%\%slnFolderName%.sln -c %slnConfiguration%

rem ...

rem Publish main project (and all dependencies)
dotnet publish -r win10-x64 -c:%slnConfiguration% -p:PublishSingleFile=true -o:"..\output\publish" %projectName%\%projectName%.csproj
Re[5]: Как настроить сборку в VS2019
От: varenikAA https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 12.01.21 01:56
Оценка:
Здравствуйте, Вертер, Вы писали:


AA>>Большая проблема msbuild что триггер публикации срабатывает несколько раз.

AA>>Я обхожу это через создание файла флажка и чекаю его наличие в скрипте (fsx).

В>Что вы имеете ввиду?


Для увеличения номера сборки использую скрипт и триггер паблиш, так вот он может в зависимости от
сложности решения несколько раз выполняться хз почему, поэтому при первом выполнении создается флажок.
суть задачи получить версию, номер сборки увеличивается при релизе(хранится в файлике), а ревизия берется из свн.
  кусок кода
<Project Sdk="Microsoft.NET.Sdk.Web" InitialTargets="SetVersion">

  <PropertyGroup>
    <Version>$([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)\build.txt"))</Version>
  </PropertyGroup>

  <Target Name="SetVersion" Condition=" '$(Configuration)' == 'Release' And '$(MSBuildProjectFile)' != '' ">
    <Exec Command="fsi build.fsx $(MSBuildProjectFile)" />
  </Target>

<Target Name="MyPrePublish" BeforeTargets="Publish">
  <Delete Files="build.pid" />
</Target>

<Target Name="PostPublish" AfterTargets="AfterPublish">
        <Exec Command="start build.cmd $(PublishUrl) $(MSBuildProjectName)" />
</Target>


open System
open System.IO
open System.Diagnostics

let read = File.ReadAllText  
printfn "%s" Environment.CommandLine
async {do! Async.Sleep 1000} |> Async.RunSynchronously
if File.Exists("build.pid") then
    printfn "==== Repeat Update version to %s done ====" (read "build.txt")
else
    File.WriteAllText("build.pid", Process.GetCurrentProcess().Id.ToString())
    let cd = Directory.GetCurrentDirectory()
    printfn "cd = %s" cd
    let sample = read "build.sample"
    printfn "old sample %s" sample
    let numbers = sample.Split('.')
    let build = Convert.ToInt32(numbers.[2]) + 1
    let newSample = sprintf "%s.%s.%d.%s" numbers.[0] numbers.[1] build numbers.[3]
    File.WriteAllText("build.sample", newSample)
    printfn "new sample %s" newSample
    Process.Start("subwcrev", sprintf "%s\\..\\..\\ build.sample build.txt" cd).WaitForExit()
    printfn "==== Update version to %s done ====" (read "build.txt")


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