ASP.NET Ядро 2.2 и угловой шаблон с monorepo

#angularjs #asp.net-core #asp.net-core-2.2

#angularjs #asp.net-ядро #asp.net-core-2.2

Вопрос:

Структура шаблона по умолчанию содержит все в одном месте, например:

 /
  bin/
  obj/
  ClientApp/
  myproject.csproj
  Startup.cs
  etc.
  

В моей структуре много библиотек и приложений angular, то есть monorepo, поэтому она должна быть более организованной:

 /
  libs
    client
    client2
    server
      bin/
      obj/
      myproject.csproj
      Startup.cs
    lib1
    lib2
  

Я отредактировал различные ссылки, чтобы отразить эту структуру, самое главное Startup.cs :

 services.AddSpaStaticFiles(configuration => {
  configuration.RootPath = "../../../../client/dist";
});

// and

app.UseSpa(spa => {
  spa.Options.SourcePath = "../../../../client";
});
  

Но при запуске я получаю: InvalidOperationException: Failed to start 'npm' .

Когда я запускаю сервер и клиент отдельно, они работают … так что проблема в том, как настроены «spa-сервисы». Я пробовал оба ../../../../client (из каталога bin) и ../client (из базового каталога серверного проекта).

Как мне перенастроить структуру проекта? (Есть ли где-нибудь рабочий образец репозитория?)

Ответ №1:

Вы не можете запустить свое приложение в папке dist, когда находитесь в режиме разработки, потому что папка dist используется только для производственного режима

Настройки по умолчанию такие

 services.AddSpaStaticFiles(configuration =>
{
   configuration.RootPath = "ClientApp/dist";
});

app.UseSpa(spa =>
{
   spa.Options.SourcePath = "ClientApp";

   if (env.IsDevelopment())
   {
      spa.UseAngularCliServer(npmScript: "start");
   }
});
  

Итак, чтобы запустить ваше приложение, вы должны создать папку в том же корне, что и файл Startup.cs по умолчанию или ClientApp, как в вашем случае, libs, тогда это будут libs / client

Затем измените настройку

 services.AddSpaStaticFiles(configuration =>
    {
       configuration.RootPath = "libs/client/dist";
    });

    app.UseSpa(spa =>
    {
       spa.Options.SourcePath = "libs/client";

       if (env.IsDevelopment())
       {
          spa.UseAngularCliServer(npmScript: "start");
       }
    });
  

Пожалуйста, обратите внимание, что вы можете запустить только 1 приложение angular с этим параметром, если вы хотите запустить другое приложение angular, вам нужно управлять им самостоятельно вручную

Комментарии:

1. Спасибо, но это предполагает, что сервер и клиент находятся на одном уровне иерархии, а это не то, чего я хочу. Я хочу полного разделения между ними.

2. Как вы хотите разделить? Запустите приложение angular на другом порту или на том же порту, что и ваш ASP.Net Основное приложение?

3. Разделите, как я показываю в вопросе. Ничего общего с портами. Просто измените структуру каталогов. Шаблон представляет собой беспорядок, если вы используете monorepo.

4. Пожалуйста, посмотрите мой второй фрагмент кода. Я поместил его в папку libs / client, как хочу, и я уже упоминал Please note that you can only run 1 angular app with this setting if you want to run another angular app you need to manage it selft manually

5. Нет, это не так, как я уже говорил выше — пути подразумевают, что Startup.cs он находится за пределами своего собственного проекта и находится в родительском корне клиентского проекта, т. Е. Сервер является родительским для клиента. В monorepo каждый проект является отдельным, Но между ними есть ссылки для сборки и т. Д. Спасибо за попытку … 🙂

Ответ №2:

У меня это работает так:

1 изменен на структуру monorepo, как показано в моем вопросе выше

2 отредактировано Server.csproj (пути указаны относительно каталога серверного приложения):

 <!--<SpaRoot>ClientApp</SpaRoot>-->
<SpaRoot>../client/</SpaRoot>
  

3 отредактировано Startup.cs (пути указаны относительно каталога рабочей области):

 services.AddSpaStaticFiles(configuration => {
  //configuration.RootPath = "ClientApp/dist";
  configuration.RootPath = "./libs/client/dist";
});
  

и

 app.UseSpa(spa => {
  //spa.Options.SourcePath = "ClientApp";
  spa.Options.SourcePath = "./libs/client";
  // etc.
});