Лучший инструмент сборки.NET [дубликат]

Здесь я вижу 2 варианта:

  • Используйте кинжал, как он предназначен. Создайте для каждого baseUrl свой собственный клиент Retrofit или
  • Используйте перехватчик для изменения запроса перед его отправкой

Подход кинжала

Если бы вы использовали URL-адреса грубой силы, это, вероятно, не было бы правильным выбором, поскольку он полагался на создание нового экземпляра Retrofit для каждого.

Теперь каждый раз, когда URL-адрес изменяется, вы просто воссоздаете после демонстрации UrlComponent путем подачи его новым UrlModule.

Очистить

Очистить модуль @Singleton, чтобы он обеспечивал GsonConverterFactory и RxJavaCallAdapterFactory для правильного использования кинжала и не воссоздать общие объекты.

@Module
public class SingletonModule {

  @Provides
  @Singleton
  GsonConverterFactory provideOkHttpClient() {/**/}

  @Provides
  @Singleton
  RxJavaCallAdapterFactory provideOkHttpClient() {/**/}
}


@Singleton
@Component(modules = SingletonModule.class)
interface SingletonComponent {

    // sub component
    UrlComponent plus(UrlModule component);
}

Url Scoped

Представьте @UrlScope для охвата ваших экземпляров Retrofit.

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface UrlScope {
}

Затем создайте подкомпонент

@SubComponent(modules=UrlModule.class)
public interface UrlComponent {}

И модуль для него

@Module
class UrlModule {

    private final String mUrl;

    UrlModule(String url) { mUrl = url; }

    @Provides
    String provideUrl() {
        return mUrl;
    }

    @Provides
    @UrlScope
    OkHttpClient provideOkHttpClient(String url) {
        return new OkHttpClient.Builder().build();
    }

    @Provides
    @UrlScope
    Retrofit provideRetrofit(OkHttpClient client) {
        return new Retrofit.Builder().build();
    }

}

Использовать область действия Retrofit

Произвести активацию компонента и использовать

class Dagger {

    public void demo() {
        UrlModule module = new UrlModule(/*some url*/);
        SingletonComponent singletonComponent = DaggerSingletonComponent.create();
        UrlComponent urlComponent = singletonComponent.plus(module);

        urlComponent.getRetrofit(); // done.
    }
}

Подход OkHttp

Обеспечьте в этом случае правильно перехваченный перехватчик (@Singleton) и реализуйте соответствующую логику.

@Module
class SingletonModule {

    @Provides
    @Singleton
    GsonConverterFactory provideGsonConverter() { /**/ }

    @Provides
    @Singleton
    RxJavaCallAdapterFactory provideRxJavaCallAdapter() { /**/ }

    @Provides
    @Singleton
    MyApiInterceptor provideMyApiInterceptor() { /**/ }

    @Provides
    @Singleton
    OkHttpClient provideOkHttpClient(MyApiInterceptor interceptor) {
        return new OkHttpClient.Builder().build();
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(OkHttpClient client) {
        return new Retrofit.Builder().build();
    }
}

@Singleton
@Component(modules = SingletonModule.class)
interface SingletonComponent {

    Retrofit getRetrofit();

    MyApiInterceptor getInterceptor();
}

todo Implem введите MyApiInterceptor. Вам нужно будет установить сеттер для базового url, а затем просто переписать / изменить запросы, проходящие через.

Затем снова запустите и используйте его.

class Dagger {

    public void demo() {
        SingletonComponent singletonComponent = DaggerSingletonComponent.create();
        MyService service = singletonComponent.getRetrofit().create(MyService.class);
        MyApiInterceptor interceptor = singletonComponent.getInterceptor();

        interceptor.setBaseUrl(myUrlA);
        service.doA();
        interceptor.setBaseUrl(someOtherUrl);
        service.doB();
    }
}

В качестве третьего подхода вы также можете использовать отражение , чтобы просто изменить базовый базовый URL-адрес и я добавил это последнее только для полноты.

41
задан Community 23 May 2017 в 12:26
поделиться

12 ответов

Мы на самом деле используем комбинацию NAnt и MSBuild с CruiseControl. NAnt используется для управления потоком сценария и называет MSBuild для компиляции проектов. После того, как физическая сборка инициирована, NAnt используется для публикации отдельных выводов сборки проекта к общему ресурсу.

я не уверен, что это лучшее процесс. Я думаю, что многие из нас все еще ищут большой инструмент сборки. Одна многообещающая вещь, которую я недавно услышал на Скалах.NET, эпизод 362 , PSake James Kovac, система сборки, которую он основывал полностью на PowerShell. Это звучит действительно многообещающим начиная с того, что можно сделать с PowerShell, довольно безгранично в теории.

28
ответ дан Peter Mortensen 27 November 2019 в 00:37
поделиться

Вообще говоря, у меня складывается впечатление, что NAnt предлагает большую гибкость по сравнению с MSBuild, тогда как (с моими относительно простыми потребностями) я до сих пор был в порядке с последним.

0
ответ дан Peter Mortensen 27 November 2019 в 00:37
поделиться

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

0
ответ дан TheSmurf 27 November 2019 в 00:37
поделиться

Это также зависит от [1 110], что Вы создаете. Библиотека MSBuild SDC Task имеет несколько специальных задач. Например, для AD, BizTalk, и т.д.

существует более чем 300 задач, включенных в эту библиотеку включая задачи для: создание веб-сайтов, создание пулов приложений, создание пользователей ActiveDirectory, выполнение FxCop, конфигурирование виртуальных серверов, создание zip-файлов, конфигурирование COM + , создание долей папки, установка в GAC, конфигурирование SQL Server, конфигурирование BizTalk 2004 и BizTalk 2006, и т.д.

1
ответ дан Peter Mortensen 27 November 2019 в 00:37
поделиться

Я использовал оба и предпочитаю NAnt . Мне действительно трудно сказать, что одно "лучше", чем другое.

1
ответ дан Peter Mortensen 27 November 2019 в 00:37
поделиться

Мы используем MSBuild, потому что мы запустили с Visual  Studio  2005 (теперь Visual  Studio  2008), и MSBuild был уже "встроен" к SDK - на сервере сборки существует меньше обслуживания. Это - клон NAnt, действительно - оба инструмента бесконечно гибки в этом, они позволяют Вам создать сделанные на заказ задачи в коде, и у обоих есть достойный набор задач сборки сообщества, уже созданных.

2
ответ дан Peter Mortensen 27 November 2019 в 00:37
поделиться

Использование динамических языков сценариев, таких как Python, BOO, Ruby и т. Д., Для создания и поддержки сценариев сборки может быть хорошей альтернативой основанным на XML, таким как NAnt. (Они имеют тенденцию быть чище, чем XML.)

1
ответ дан Ray Vega 27 November 2019 в 00:37
поделиться

Я использую MSBuild полностью для создания. Вот мой универсальный сценарий MSBuild, который ищет дерево .csproj файлы и создает их:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <UsingTask AssemblyFile="$(MSBuildProjectDirectory)\bin\xUnit\xunitext.runner.msbuild.dll" TaskName="XunitExt.Runner.MSBuild.xunit"/>
  <PropertyGroup>
    <Configuration Condition="'$(Configuration)'==''">Debug</Configuration>
    <DeployDir>$(MSBuildProjectDirectory)\Build\$(Configuration)</DeployDir>
    <ProjectMask>$(MSBuildProjectDirectory)\**\*.csproj</ProjectMask>
    <ProjectExcludeMask></ProjectExcludeMask>
    <TestAssembliesIncludeMask>$(DeployDir)\*.Test.dll</TestAssembliesIncludeMask>
  </PropertyGroup>

  <ItemGroup>
    <ProjectFiles Include="$(ProjectMask)" Exclude="$(ProjectExcludeMask)"/>
  </ItemGroup>

  <Target Name="Build" DependsOnTargets="__Compile;__Deploy;__Test"/>

  <Target Name="Clean">
    <MSBuild Projects="@(ProjectFiles)" Targets="Clean"/>
    <RemoveDir Directories="$(DeployDir)"/>
  </Target>

  <Target Name="Rebuild" DependsOnTargets="Clean;Build"/>

  <!--
  ===== Targets that are meant for use only by MSBuild =====
  -->
  <Target Name="__Compile">
    <MSBuild Projects="@(ProjectFiles)" Targets="Build">
      <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt"/>
    </MSBuild>
    <CreateItem Include="@(AssembliesBuilt -> '%(RootDir)%(Directory)*')">
      <Output TaskParameter="Include" ItemName="DeployFiles"/>
    </CreateItem>
  </Target>

  <Target Name="__Deploy">
    <MakeDir Directories="$(DeployDir)"/>
    <Copy SourceFiles="@(DeployFiles)" DestinationFolder="$(DeployDir)"/>
    <CreateItem Include="$(TestAssembliesIncludeMask)">
      <Output TaskParameter="Include" ItemName="TestAssemblies"/>
    </CreateItem>
  </Target>

  <Target Name="__Test">
    <xunit Assembly="@(TestAssemblies)"/>
  </Target>
</Project>

(Извините, если это немного плотно. Скидка с цены, кажется, снимает пустые строки.)

Это довольно просто, хотя, после того как Вы понимаете, понятия и все зависимости обрабатываются автоматически. Я должен отметить, что мы используем файлы проекта Visual Studio, которые имеют большую логику, встроенную в них, но эта система позволяет людям создавать почти тождественно и в рамках Visual Studio IDE или в командной строке и все еще дает Вам гибкость добавляющих вещей к канонической сборке как xUnit тестирование, Вы видите в сценарии выше.

Тот, который - PropertyGroup то, где вся конфигурация происходит и вещи, может быть настроен, как исключение определенных проектов от сборки или добавления новых масок опытной сборки.

ItemGroup - то, где логика происходит, который находит все .csproj файлы в дереве.

Затем существуют цели, которые большинство людей, знакомых с, делает, nAnt, или MSBuild должен смочь следовать. При вызове цели Сборки она звонит __, Компиляция, __ Развертываются и __ Тест. Чистая цель называет MSBuild на всех файлах проекта для них для чистки их каталогов, и затем каталог глобального развертывания удален. Восстановите Чистые вызовы и затем Сборка.

8
ответ дан Lee 27 November 2019 в 00:37
поделиться

Я был бы точно так же, как для броска FinalBuilder в к соединению. Это не свободно, но если Вы сыты по горло редактированием XML файлы и хотите, чтобы несколько более хорошее ( IMO) среда работало в, я дал бы ему движение.

я работал со всеми ними и имею, всегда возвращался в FinalBuilder.

18
ответ дан Peter Mortensen 27 November 2019 в 00:37
поделиться

Я использую коммерческое программное обеспечение, Automated Build Studio для целей сборки.

2
ответ дан Graviton 27 November 2019 в 00:37
поделиться

UppercuT использует NAnt для сборки, и это безумно простая в использовании среда сборки.

Автоматическая сборка - это просто: (1) имя решения, (2) путь управления исходным кодом, (3) название компании для большинства проектов!

http://projectuppercut.org/

Вот несколько хороших объяснений: UppercuT

0
ответ дан 27 November 2019 в 00:37
поделиться

Есть еще один новый инструмент сборки (очень интеллектуальная оболочка) под названием NUBuild . Он легкий, с открытым исходным кодом, чрезвычайно прост в настройке и обеспечивает практически бесконтактное обслуживание. Мне очень нравится этот новый инструмент, и мы сделали его стандартным инструментом для непрерывной сборки и интеграции наших проектов (у нас около 400 проектов от 75 разработчиков). Попробуйте сами.

http://nubuild.codeplex.com/

  • Простой в использовании интерфейс командной строки
  • Возможность работы со всеми .NET Framework версии, то есть 1.1, 2.0, 3.0 и 3.5
  • Поддерживает конфигурацию на основе XML
  • Поддерживает как проект, так и файл ссылки
  • Автоматически генерирует «полный упорядоченный список сборки »для данного проект - Без сенсорного обслуживания.
  • Возможность обнаружения и отображения круговые зависимости
  • Выполнять параллельную сборку - автоматически решает, какой из проекты в сгенерированном списке сборки могут быть построены независимо.
  • Способность обрабатывать сборки прокси
  • Обеспечивает визуальный ключ к сборке процесс, например, показывающий «% завершен», «Текущий статус» и т. Д.
  • Создает подробный журнал выполнения как в XML и текстовом формате
  • Легко интегрируется с CruiseControl.NET постоянно система интеграции
  • Может использовать настраиваемый регистратор, например XMLLogger при ориентации на 2.0 + версия
  • Возможность анализа журналов ошибок
  • Возможность развертывания встроенных сборок в указанное пользователем местоположение
  • Возможность синхронизации исходного кода с системой управления версиями
  • Возможность управления версиями
8
ответ дан 27 November 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: