파머스핸즈 앱
송아지 질병관찰 크로스플랫폼(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 모든 환경에 배포를 하는 경우를 가정해보겠습니다.
git checkout develop && amplify env checkout dev
명령어로 개발 환경으로 전환합니다.- develop 브랜치에서 코드를 수정합니다.
- 변경사항을 커밋합니다.
amplify push
로 배포합니다.team-provider-info.json
파일의 내용이 변경될텐데 해당 변경사항도 커밋합니다.git checkout test && amplify env checkout test
명령어로 테스트 환경으로 전환합니다.git merge develop --no-ff
명령어로 develop 브랜치를 test 브랜치에 병합합니다. (이때team-provider-info.json
충돌이 난다면 test 브랜치의team-provider-info.json
의 내용을 취합니다.)amplify push
로 배포합니다.team-provider-info.json
내용이 변경될텐데 해당 변경사항을 test브랜치에 커밋합니다.git checkout prod && amplify env checkout prod
명령어로 상용 환경으로 전환합니다.git merge test --no-ff
명령어로 test 브랜치를 prod 브랜치에 병합합니다.amplify push
로 배포합니다.team-provider-info.json
내용이 변경될텐데 해당 변경사항을 prod브랜치에 커밋합니다.- (선택사항)
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
- 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_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_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
- dropdown_form_view
- 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_sub_view
- group_list_view
- header_text_view
- header_view
- header_view
- header_view
- health_doubt_report_card
- health_doubt_subscreen
- helper
- home_screen
- home_screen_vm
- 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
- popup_action
- popup_events
- popup_impl
- popup_screen
- popup_screen_arguments
- popup_subname_view
- popup_title_view
- popup_type
- 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
- converting_methods Models
- 모델파일에서 json 파싱이 이루어질때 기본 자료형(String, int)이 아닌 경우 커스텀 컨버팅 함수들을 정의해놓았습니다.