파머스핸즈 앱

송아지 질병관찰 크로스플랫폼(iOS, Android) 모바일 앱입니다. 각 하위 폴더들의 README.md를 참고해주세요.

플레이스토어 링크

상용 테스트환경 개발환경

앱스토어 링크

상용 앱

목차

개발 환경을 변경하는 방법

기본적으로 develop 브랜치에서 개발을 진행하시면 되며 test, prod 브랜치상에서 코드 수정은 하지 않는 것이 좋습니다.

개발환경은 git checkout을 먼저 한 후 amplify env를 바꿔주어야 합니다.

develop 브랜치에는 amplify dev 환경만 존재합니다.

test 브랜치에는 amplify dev, test 환경만 존재합니다.

prod 브랜치에는 amplify dev, test, prod 환경 모두 존재합니다.

# git 브랜치 변경
$ git checkout <develop | test | prod>

# amplify 환경 변경 
$ amplify env checkout <dev | test | prod> 

Git 병합하는 방법

상용앱에 배포하기 전에는 브랜치 병합이 필요합니다.

병합

develop -> test

test -> prod

prod -> master 순으로 병합을 진행하시면 되고 master 브랜치는 병합을 하지 않아도 문제는 없습니다.

병합시 team-provider-info.json 충돌이 발생할 경우

amplify push를 하면 team-provider-info.json 파일의 내용이 변경됩니다. 또는 기타 이유로 병합시 충돌이 날 수 있을텐데 현재 브랜치의 변경사항만 가져오면 됩니다.

예를 들어, develop 브랜치에서 test 브랜치로 병합을 할 경우 test 브랜치의 team-provider-info.json 내용만을 취하면 됩니다.

test 브랜치에서 prod 브랜치로 병합할때는 prod 브랜치의 team-provider-info.json을 취하면 되겠죠.

Amplify 코드 수정후 배포하는 방법

develop 브랜치에서 amplify 코드를 수정하고 amplify push를 입력합니다. 그럼 team-provider-info.json 파일 내용이 변경될텐데 변경사항을 해당 브랜치에 커밋하시면 됩니다.

예를 들어, dev, test, prod 모든 환경에 배포를 하는 경우를 가정해보겠습니다.

  1. git checkout develop && amplify env checkout dev 명령어로 개발 환경으로 전환합니다.
  2. develop 브랜치에서 코드를 수정합니다.
  3. 변경사항을 커밋합니다.
  4. amplify push로 배포합니다.
  5. team-provider-info.json 파일의 내용이 변경될텐데 해당 변경사항도 커밋합니다.
  6. git checkout test && amplify env checkout test 명령어로 테스트 환경으로 전환합니다.
  7. git merge develop --no-ff 명령어로 develop 브랜치를 test 브랜치에 병합합니다. (이때 team-provider-info.json 충돌이 난다면 test 브랜치의 team-provider-info.json의 내용을 취합니다.)
  8. amplify push로 배포합니다.
  9. team-provider-info.json 내용이 변경될텐데 해당 변경사항을 test브랜치에 커밋합니다.
  10. git checkout prod && amplify env checkout prod 명령어로 상용 환경으로 전환합니다.
  11. git merge test --no-ff 명령어로 test 브랜치를 prod 브랜치에 병합합니다.
  12. amplify push로 배포합니다.
  13. team-provider-info.json 내용이 변경될텐데 해당 변경사항을 prod브랜치에 커밋합니다.
  14. (선택사항) git checkout master && git merge prod --no-ff 명령어로 prod 브랜치를 master에 병합합니다.

앱 배포하는 방법

배포 스크립트는 프로젝트 루트에 위치한 deploy.sh에 작성되어있습니다.

$ <PROJECT_ROOT>/deploy.sh

이 파일을 실행시키면 dist/ 디렉토리에 각 환경별 .aab 파일과 .xcarchive 파일이 생성됩니다.

디렉토리 구조

project
│   pubspec.yaml
│   package.json
│   deploy.sh
│   flutter_launcher_icons-envDev.yaml
│   flutter_launcher_icons-envProd.yaml
│   flutter_launcher_icons-envTest.yaml
│
└───amplify
│   │   team-provider-info.json
│   └───backend
│       └───api
│           └───FarmersHandsClientAPI
│       └───auth
│       └───function
│           └───farmershandsuserappc02bf2d8
│               │   tsconfig.json
│               │
│               └───src
│               └───ts-src
│                   └───routes
│                       │   app.ts
│                       │   index.ts
│                       │   utils.ts
│                       │   package.json
│                       │
│                       └───api
│                           │   cow_data.ts
│                           │   cow_group.ts
│                           │   cows.ts
│                           │   disease_observations.ts
│                           │   engagement.ts
│                           │   farms.ts
│                           │   index.ts
│                           │   reports.ts
│                           │   user.ts
│
└───android
│   │   build.gradle
│   │   key.properties
│   │   local.properties
│   │   
│   └───app
│       │   build.gradle
│       │   google-services.json
│       │   key.jks
│       │   
│       └───src
│           │   
│           └───main
│               │   AndroidManifest.xml
│
└───assets
│   └───icons
│   └───images
│   └───vectors
│
└───google_fonts
│
│   
└───ios
│   │   Runner.xcodeproj
│   │   Runner.xcworkspace
│   │
│   └───Flutter
│   │
│   └───Runner
│   
└───lib
    │   app_entry.dart
    │   main.dart
    │   main_dev.dart
    │   main_test.dart
    │   notifications.dart
    │
    └───components
    │
    └───events
    │
    └───extensions
    │
    └───interfaces
    │
    └───models
    │
    └───screen_arguments
    │
    └───screens
    │
    └───services
    │
    └───stores
    │
    └───types
    │
    └───utils
    │
    └───views

Libraries

account_subscreen
action_type
add_cows_to_cow_group_popup
alert_popup
amplifyconfiguration
api_service
app_config
app_constants
app_entry
app_state
bar_day_data
bar_graph
bar_graph_painter
bar_graph_ylabel_painter
bar_hour_data
base_popup
base_report_card
bcs_type
bottom_sheet_group_menu_view
chat_list_subscreen
chat_list_subscreen_arguments
chat_list_subscreen_vm
chat_message
chat_message_bubble_view_me
chat_message_bubble_view_you
chat_screen
chat_screen_vm
checkbox_form_view
circle_button
circle_image_view
common_app_bar
confirm_popup
constants
copy_cows_to_other_group_popup
cow
cow_current_status_data_table_expanded_row
cow_current_status_data_table_expanded_row_painter
cow_current_status_screen
cow_current_status_screen_vm
cow_data
cow_data_band_value
cow_data_day
cow_data_hour
cow_data_value
cow_detail_screen
cow_detail_screen_arguments
cow_detail_screen_vm
cow_group
cow_group_management_subscreen
cow_group_state
cow_history_subscreen
cow_management_subscreen
cow_settings_screen
cow_settings_screen_vm
cow_state
cow_status
cow_status_distribution_column_view
cow_status_distribution_view
cow_status_type
create_new_cow_group_popup
create_new_cow_popup
custom_colors
custom_data_table
custom_data_table_type
custom_outlined_button
custom_refresher
custom_scrollbar
data_table_cell
data_table_column
data_table_row
datetime_picker_screen
datetime_picker_screen_arguments
desc_dropdown_view
desc_text_view
desc_textfield_view
device_management_subscreen
disease_observation
disease_observation_create_screen
disease_observation_create_screen_arguments
disease_observation_create_screen_vm
disease_observation_list_screen
disease_observation_list_screen_vm
doctor
empty_screen
event_handler
event_service
farm
farm_info_screen
farm_info_screen_vm
farm_input_code_screen
farm_input_code_screen_vm
farm_loading_screen
farm_loading_screen_vm
farm_management_subscreen
farm_select_screen
farm_select_screen_vm
farm_state
feedback_type
find_password_screen
find_password_screen_vm
find_username_screen
find_username_screen_vm
gateway
gateway_management_subscreen
gateway_need_check_report_card
gateway_popup
gateway_state
generated_plugin_registrant
graph_avg_type
graph_view_type
graph_ylabel_text
grid_menu_view
grid_sub_view
group_list_view
group_menu_view
header_text_view
header_view
header_view
header_view
health_doubt_report_card
health_doubt_subscreen
helper
helpful_buttons_view
home_menu_type
home_screen
home_screen_vm
horizontal_menu_view
ic_circle_grey_info
input_mode_type
iterable
juso
juso_point
juso_returns
juso_service
juso_vm
large_header_view
linear_progress_bar
linear_progress_bar_painter
loading_popup
loading_view
log_constants
log_manager
main
main_circle_view
main_dev
main_screen
main_test
move_cows_to_other_cow_group_popup
need_check_subscreen
no_animation_tab_controller
no_glow_scroll_behavior
notification_management_subscreen
notification_service
numeric_constants
odd_action_report_card
odd_action_subscreen
phone_auth_resend_screen
phone_auth_resend_screen_vm
phone_auth_screen
phone_auth_screen_arguments
phone_auth_screen_vm
phone_number_formatter
photo_view_screen
photo_view_screen_arguments
preference
prefs_constants
remove_cow_group_popup
remove_cow_groups_popup
remove_cow_popup
remove_cows_from_cow_group_popup
report
report_card_count_item_view
report_card_count_view
report_card_desc_text_view
report_card_input_memo_view
report_card_list_title_view
report_card_list_view
report_card_title_text_view
report_card_view_vm
report_events
report_group
report_header_view
report_screen
report_screen_arguments
report_screen_vm
report_state
report_title
report_type
root_report_card_view
round_container_view
screen_impl
scroll_state
search_cow_action
search_cow_events
search_cow_result
search_cow_screen
search_cow_screen_vm
search_juso
search_result_list_item_view
search_result_list_view
search_textfield_view
select_date_view
self_diagnosis
self_diagnosis_screen
sensor
sensor_management_subscreen
sensor_popup
sensor_removal_report_card
sensor_state
settings_screen
settings_screen_vm
settings_subscreen
signin_screen
signin_screen_vm
signup_screen
signup_screen_vm
software_management_subscreen
splash_screen
stack_data
stat_item_view
stateful_widget_template
stateless_widget_template
string_constants
text_form_view
update_cow_popup
user
user_info_screen_vm
user_info_subscreen
user_list_subscreen
user_state
validators
weather_service
webview_screen
webview_screen_arguments
worker

Models

converting_methods Models
모델파일에서 json 파싱이 이루어질때 기본 자료형(String, int)이 아닌 경우 커스텀 컨버팅 함수들을 정의해놓았습니다.