VS2008이 있는데 특정 파일을 디렉터리에서 내 /bin/
폴더 로 복사하고 싶습니다 . 파일 (에 있음 /common/browserhawk/
)을 "출력 디렉토리에 복사"로 설정했습니다. 그러나 폴더 구조도 복사합니다. 파일이/bin/common/browserhawk/
이 파일을 어떻게 복사 할 수 /bin/
있습니까? 올바르게 복사하기 위해 웹 사이트의 루트에 저장하고 싶지 않습니다.
VS2008이 있는데 특정 파일을 디렉터리에서 내 /bin/
폴더 로 복사하고 싶습니다 . 파일 (에 있음 /common/browserhawk/
)을 "출력 디렉토리에 복사"로 설정했습니다. 그러나 폴더 구조도 복사합니다. 파일이/bin/common/browserhawk/
이 파일을 어떻게 복사 할 수 /bin/
있습니까? 올바르게 복사하기 위해 웹 사이트의 루트에 저장하고 싶지 않습니다.
답변:
빌드 후 이벤트를 추가하여 파일을 복사 할 수 있습니다.
프로젝트 속성, 빌드 이벤트 탭으로 이동하여 빌드 후 이벤트 명령 줄에 다음을 추가합니다.
copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"
프로젝트 경로에 공백이있는 경우 따옴표를 포함해야합니다.
xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
이전 답변에 대해 언급 할 수 없으므로 여기에 솔루션을 넣겠습니다.
@PaulAlexander가 제공 한 내용에 추가하여 .csproj / .vbproj 파일에 다음을 추가합니다.
<ItemGroup>
<AvailableItemName Include="RootContent">
<Visible>false</Visible>
</AvailableItemName>
</ItemGroup>
<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
이를 통해 속성 창에서 빌드 작업으로 "RootContent"를 선택할 수 있으며 모두 GUI를 통해 액세스 할 수 있습니다. 보다 완전한 설명 : "AvailableItemName"옵션은 기본적으로 속성 창의 "Build Action"속성 아래에 프로젝트의 항목을 할당 할 수있는 새 명명 된 목록을 만듭니다. 그런 다음이 새로 생성 된 목록을 원하는 대상에서 사용할 수 있습니다 (예 : "@ (RootContent)"를 통해).
AvailableItemName
에서 VS 내에서 프로젝트 파일을 편집하면 잘못된 요소가 된다고 불평 합니다. 경고를 무시하십시오. 어쨌든 작동합니다.
<Target Name="RootOutputCopyTarget" AfterTargets="Build">
... </ Target>
텍스트 편집기에서 .csproj / .vbproj를 편집하면 파일이 출력 디렉터리에 배치되는 위치와 출력 디렉터리에 파일 이름이 지정되는 것을 제어 할 수 있습니다. 예를 들면 :
<None Include="content\someContent.txt">
<Link>someContentInOutputDirectory.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
그러면 파일 content\someContent.txt
이 bin\someContentInOutputDirectory.txt
. bin
원하는 경우 하위 디렉토리를 선택할 수도 있습니다 . Link 요소에 추가하기 만하면됩니다.
XCOPY 명령이 디렉토리와 파일을 더 잘 처리한다고 생각합니다. 따라서,
XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y
대상 디렉토리에서 폴더를 만들 수 있습니다.
XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y
프로젝트 폴더 / 파일 구조 :
A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
├───NewFolder1
├───NewFolder2
│ TextFile1.txt
│ TextFile2.txt
└───NewFolder3
TextFile1.txt
TextFile2.txt
TextFile3.txt
된다 :
A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
│ ConsoleApplication3.exe
│ ConsoleApplication3.pdb
│ ConsoleApplication3.vshost.exe
│ ConsoleApplication3.vshost.exe.manifest
├───NewFolder1
├───NewFolder2
│ TextFile1.txt
│ TextFile2.txt
│
└───NewFolder3
TextFile1.txt
TextFile2.txt
TextFile3.txt
/D
가능한 변경 사항을 덮어 쓰지 않도록하는데도 유용 할 수 있습니다.
.csproj / .vbproj 파일에 다음을 추가합니다.
<Target Name="AfterBuild">
<Copy
DestinationFolder="$(OutputPath)"
SourceFiles="@(RootContent)"
SkipUnchangedFiles="true"
/>
</Target>
그런 다음 루트 폴더에서 원하는 파일의 빌드 작업을 RootContent로 변경합니다.
RootContent
"Build Action"드롭 다운 목록에 표시되지 않고 수동으로 입력하면 Visual Studio에서 "Property value is not valid"오류가 발생합니다. 내가 놓친 게 무엇입니까?
나는 이것을 VS2010, VS2015, VS2017 및 VS2019에서 사용했습니다. 다음과 같은 이유로이 솔루션을 선호합니다.
<RootContent Include="common\browserhawk\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</RootContent>
프로젝트 파일 시작쪽으로 :
<ItemGroup>
<AvailableItemName Include="RootContent">
<!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
<Visible>True</Visible>
</AvailableItemName>
</ItemGroup>
Microsoft .targets 가져 오기 후 :
<PropertyGroup>
<AssignTargetPathsDependsOn>
$(AssignTargetPathsDependsOn);
IncludeRootContentAsContent;
</AssignTargetPathsDependsOn>
</PropertyGroup>
<Target Name="IncludeRootContentAsContent">
<CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
<Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
</CreateItem>
</Target>
RootContent
"하드 코딩 된"이라는 의미를 바꾸어 CustomContent
이것이 우리가이 프로젝트에 추가하고있는 특수 콘텐츠임을 나타 내기 위해이 특별한 방식으로 복사해야합니다. 또한 제쳐두고 TargetPath=%(RecursiveDir)%(Filename)%(Extension)
지정된 CustomContent
파일에서 출력 경로로 폴더 구조를 다시 만들어야했습니다 .
/common/browserhawk/
이 복사되지 /bin/common/browserhawk/
않습니까? IIRC, 내 의도는 것이 었 /common/browserhawk/a.txt
에 결국 /bin/a.txt
그렇게하지만, 거기 아래에서 재귀를 허용 /common/browserhawk/secret/stuff.png
에 끝납니다 /bin/secret/stuff.png
.
%(RecursiveDirectory)
. IDE에서 개별 파일을 선택하는 것 외에도 와일드 카드를 사용하여 여러 파일을 지정할 수 있기 때문에 정말 멋집니다. **
와일드 카드를 사용하면 전체 폴더 구조가 유지됩니다.
성공적인 컴파일 후 복사 할 nant 빌드 파일에 단계를 추가했습니다.
<target name="action.copy.browserhawk.config" depends="compile.source">
<copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
<fileset basedir="${browserhawk.config.dir}">
<include name="bhawk_bb.dat" />
<include name="bhawk_sp.dat" />
<include name="browserhawk.properties" />
<include name="maindefs.bdd" />
<include name="maindefs.bdf" />
<include name="BH_PRO.lic" />
</fileset>
</copy>
<echo message="COPY BROWSERHAWK CONFIG: SUCCESS ${datetime::now()}" />
</target>
배치 파일을 빌드하여 파일을 복사하고 빌드 후 이벤트로 실행할 수 있습니다.