#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.
});