IT story

출력 디렉토리로 복사는 폴더 구조를 복사하지만 파일 만 복사하려고합니다.

hot-time 2020. 9. 11. 19:39
반응형

출력 디렉토리로 복사는 폴더 구조를 복사하지만 파일 만 복사하려고합니다.


VS2008이 있는데 특정 파일을 디렉터리에서 내 /bin/폴더 로 복사하고 싶습니다 . 파일 (에 있음 /common/browserhawk/)을 "출력 디렉토리에 복사"로 설정했습니다. 그러나 폴더 구조도 복사합니다. 파일이/bin/common/browserhawk/

이 파일을 어떻게 복사 할 수 /bin/있습니까? 올바르게 복사하기 위해 웹 사이트의 루트에 저장하고 싶지 않습니다.

관련 질문 : Visual Studio는 컴파일 후 프로젝트에 .dll 및 .pdb를 추가합니다.


빌드 후 이벤트를 추가하여 파일을 복사 할 수 있습니다.
프로젝트 속성, 빌드 이벤트 탭으로 이동하고 빌드 후 이벤트 명령 줄에 다음을 추가합니다.

copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"

프로젝트 경로에 공백이있는 경우 따옴표를 포함해야합니다.


이전 답변에 대해 언급 할 수 없으므로 여기에 솔루션을 넣겠습니다.

@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)"를 통해).


텍스트 편집기에서 .csproj / .vbproj를 편집하면 출력 디렉터리에서 파일이 배치되는 위치와 출력 디렉터리에서 파일 이름을 제어 할 수 있습니다. 예를 들면 :

<None Include="content\someContent.txt">
  <Link>someContentInOutputDirectory.txt</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

그러면 파일 content\someContent.txtbin\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

.csproj / .vbproj 파일에 다음을 추가합니다.

<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

그런 다음 루트 폴더에서 원하는 파일의 빌드 작업을 RootContent로 변경합니다.


나는 이것을 VS2010 및 VS2015에서 사용했습니다. 다음과 같은 이유로이 솔루션을 선호합니다.

  1. XML은 모든 프로젝트에서 재사용 가능
  2. "RootContent"는 다른 "Content"와 마찬가지로 Visual Studio UI에서 빌드 작업으로 선택됩니다.
  3. "CopyToOutputDirectory"는 예상 한대로 준수됩니다.
  4. The RootContent is added to the project's output: gets carried through Project-References, obeys "Clean", etc.
  5. The RootContent can be specified with a wildcard, preserving the recursive folder structure:
    <RootContent Include="common\browserhawk\**">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </RootContent>
    

Toward the beginning of project file:

  <ItemGroup>
    <AvailableItemName Include="RootContent">
      <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
      <Visible>False</Visible>
    </AvailableItemName>
  </ItemGroup>

Borrowed From This Answer

After the Microsoft .targets Import:

  <PropertyGroup>
    <AssignTargetPathsDependsOn>
      $(AssignTargetPathsDependsOn);
      IncludeRootContentAsContent;
    </AssignTargetPathsDependsOn>
  </PropertyGroup>
  <Target Name="IncludeRootContentAsContent">
    <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>

Borrowed From This Answer


I ended up adding a step to the nant build file to copy after successful compliation

<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>

You could build a batch file to copy the files and execute it as a post-build event.

참고URL : https://stackoverflow.com/questions/1014207/copy-to-output-directory-copies-folder-structure-but-only-want-to-copy-files

반응형