codeclimate-duplication 플레이를 감싸고 Java, Ruby, Python, JavaScript 및 PHP를 지원하는 엔진입니다. 코드 기후 CLI 또는 호스팅 된 분석 플랫폼을 사용하여 명령 줄에서 실행할 수 있습니다.
복제 엔진의 알고리즘은 놀랍지 만 실제로는 매우 간단합니다. 알고리즘을 설명하는 문서 페이지가 있습니다.
cd 넣고 codeclimate analyze 실행하십시오. 복제 분석은 기본적으로 활성화되므로 다른 작업을 수행 할 필요가 없습니다. 우리는 우리가 지원하는 언어에 대한 유용한 임계 값 기본값을 설정하지만 프로젝트 지침에 따라 이러한 설정을 조정할 수 있습니다.
질량 임계 값 구성은 중복을 위해 코드 블록을 분석 해야하는 최소 "질량"을 나타냅니다. 엔진이 복제를 너무 쉽게보고하는 경우 임계 값을 높이십시오. 엔진이 충분한 복제를 포착하지 않는다고 의심되면 임계 값을 낮추십시오. 최상의 설정은 언어마다 다릅니다.
이 설정을 조정하려면 구성 파일에서 최상위 checks 키를 사용하십시오.
checks :
identical-code :
config :
threshold : 25
similar-code :
config :
threshold : 50 추가 구성을 지원하기 위해 해시 유형의 languages 키 아래에서 Yaml 구조를 업데이트 할 수 있습니다.
기본적으로, 복제 엔진은 단지 두 위치에서 복제 된 코드를보고합니다. 코드가 3 개 이상의 위치에서만 복제 된 경우에만 경고 만 올리면 덜 엄격 할 수 있습니다. 이 설정을 조정하려면 count_threshold 키를 구성에 추가하십시오. 예를 들어 Ruby의 Default mass_threshold 사용하지만 3의 규칙을 시행하려면이 구성을 사용할 수 있습니다.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
count_threshold : 3 모든 언어에 대한 기본 count_threshold 변경할 수도 있습니다.
plugins :
duplication :
enabled : true
config :
count_threshold : 3 모든 엔진은 적절한 파일 만 확인하지만 기본 패턴 세트를 무시할 수 있습니다. 패턴은 프로젝트 루트 디렉토리에 대해 실행되므로 중첩 디렉토리의 파일을 일치시키기 위해 ** 사용해야합니다. 또한 추가하려는 모든 패턴뿐만 아니라 모든 패턴을 지정해야합니다.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
patterns :
- " **/*.rb
- " **/*.rake"
- " Rakefile "
- " **/*.ruby " 기본적으로 복제 엔진은 Python 2 Parser를 사용합니다. Python 3 코드에 대한 분석을 활성화하려면 아래 예제에 표시된대로 python_version 지정하십시오. 이렇게하면 Python 3 Parser가 가능하고 포함 된 파일 패턴 목록에 .py3 파일 확장자를 추가합니다.
plugins :
duplication :
enabled : true
config :
languages :
python :
python_version : 3때로는 구조적 유사성이 신경 쓰지 않는다고보고됩니다. 예를 들어, 배열 또는 해시의 내용은 비슷한 구조를 가질 수 있으며이를 리팩터링하기 위해 할 수있는 일은 거의 없습니다. 패턴과 일치하는 모든 문제를 무시하기 위해 언어 별 필터를 지정할 수 있습니다. 다음은 간단한 해시 및 어레이를 필터링하는 예입니다.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
filters :
- " (hash (lit _) (str _) ___) "
- " (array (str _) ___) " 패턴의 구문은 매우 간단합니다. 첫 번째 패턴에서 "(hash (lit _) (str _) ___)" 문자 그대로 키가있는 해시, 문자열 값, 다른 것을 포함한 (아무것도 포함하지 않음) "를 지정합니다. 모든 해시를 완전히 무시하기 위해 "(hash ___)" 지정할 수도 있습니다.
필터를 필터링 해야하는 것을 알아내는 것은 까다 롭습니다. Codeclimate-Duplication에는 검색에 도움이되는 구성 옵션이 제공됩니다. 코드를 스캔하고 CodeClimate에 대한 문제를 인쇄하는 대신 대신 구문 분석 트리를 인쇄합니다! dump_ast: true and debug: true on. codeclimate.yml 파일 :
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
debug: true
... rest of config ...
그런 다음 디버그 플래그를 사용하여 stderr을 사용하는 동안 codeclimate analyze 실행하십시오.
% CODECLIMATE_DEBUG=1 codeclimate analyze
해당 명령을 실행하면 다음과 같은 것을 출력 할 수 있습니다.
Sexps for issues:
# 1) ExpressionStatement#4261258897 mass=128:
# 1.1) bogus-examples.js:5
s(:ExpressionStatement,
:expression,
s(:AssignmentExpression,
:"=",
:left,
s(:MemberExpression,
:object,
s(:Identifier, :EventBlock),
:property,
s(:Identifier, :propTypes)),
... LOTS more...)
... even more LOTS more...)
이것은 실제 코드의 내부 표현입니다. 이러한 문제를보고 문제를 해결하지 않기로 결정했다고 가정하면 트리와 일치하는 패턴 문자열을 작성하여 필터링 할 수 있습니다.
트리 출력을 다시 보면 이번에는 평평합니다.
s(:ExpressionStatement, :expression, s(:AssignmentExpression, :"=",:left, ...) ...)
내부 표현 (루비)은 패턴 언어 (LISP와 같은)와 다르므로 먼저 s(: 모든 쉼표와 콜론 ( 제거해야합니다.
(ExpressionStatement expression (AssignmentExpression "=" left ...) ...)
다음으로, 우리는 한판 expression 신경 쓰지 않으므로 단일 요소의 모든 요소로 대체로 교체하여 그것을 제거합시다 _
(ExpressionStatement _ (AssignmentExpression "=" left ...) ...)
"=" 와 left 에도 마찬가지이지만 실제로는 과제 표현 노드의 나머지 부분에 신경 쓰지 않으므로 나머지 트리의 나머지 부분을 무시할 대상을 사용해 봅시다. ___ :
(ExpressionStatement _ (AssignmentExpression ___) ...)
그리고 마지막으로, 우리는 ExpressionStatement 에서 무엇을 따르는 지 신경 쓰지 않으므로 나머지를 무시합시다.
(ExpressionStatement _ (AssignmentExpression ___) ___)
다음은 다음과 같이 읽습니다. "모든 값과 모든 값과 할당 표현 노드가있는 모든 표현식 노드, 그 다음에 다른 표현 표현 노드가 있습니다." 이 나무와 일치하는 패턴을 작성하는 다른 방법이 있지만 이것은 매우 분명합니다.
그런 다음 해당 필터를 구성에 추가 할 수 있습니다.
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
languages:
javascript:
filters:
- "(ExpressionStatement _ (AssignmentExpression ___) ___)"
그런 다음 분석기를 다시 실행하고 다음 필터가 무엇인지 파악하십시오. 결과에 만족하면 dump_ast 구성 (또는 false로 설정)을 제거하여 정상 분석으로 돌아갑니다.
패턴 일치에 대한 자세한 내용은 sexp_processor, 특히 sexp.rb를 참조하십시오.